Como passar ponteiros para funções em c ++

Um dos usos de variáveis ​​de ponteiro em C ++ é de passagem argumentos para funções. Para entender por que isso é importante, você precisa entender como argumentos são passados ​​para uma função.

Passando pelo valor em C ++

Por padrão, os argumentos são passados ​​para funções por valor. Isto tem o resultado de certa forma surpreendente que a mudança do valor de uma variável em uma função normalmente não alterar o seu valor na função de chamada. Considere o seguinte segmento exemplo de código:

Video: Ponteiros em C/C++: Aula 3 - Ponteiros para funções e ponteiros para ponteiros

fn void (int nArg) {nArg = 10 - // valor de nArg neste momento é 10} pai (void) {int n1 = 0-fn (n1) - // valor de n1, neste ponto ainda é 0}

Aqui o pai () função inicializa o número inteiro variável n1 como 0. O valor de n1 é então passado para fn (). Ao entrar na função, nArg é igual a 0, o valor passado. fn () altera o valor do nArg a 10 antes de voltar a pai (). Ao voltar para pai (), o valor de n1 ainda é 0.

A razão para este comportamento é que C ++ não passar uma variável a uma função. Em vez disso, C ++ passa o valor contido na variável no momento da chamada. Ou seja, a expressão é avaliada, mesmo que seja apenas um nome de variável, eo resultado é passado.

No exemplo, o valor de n1, que é 0, foi passado para fn (). Que a função faz com que o valor não tem efeito sobre n1.

Passando valores de ponteiro em C ++

Como qualquer outro tipo intrínseca, um ponteiro pode ser transmitido como um argumento de uma função de:

fn vazio (int * pnArg) {* pnArg = 10-} pai (void) {int n = 0-fn (&n) - // este passa o endereço de i // agora o valor de n é 10}

Neste caso, o endereço do n é passado para a função fn () em vez do valor de n. O significado desta diferença é aparente quando você considerar a atribuição dentro fn ().



supor n está localizado na 0x100 endereço. Ao invés do valor 10, a chamada fn (&n) passa o valor 0x100. Dentro fn (), A atribuição *pnArg = 10 armazena o valor 10 no int variável localizado na localização 0x100, assim, substituindo o valor 0. Ao voltar para pai (), o valor de n 10 é porque n é apenas outro nome para 0x100.

Passar por referência em C ++

C ++ fornece um atalho para passagem de argumentos por endereço - um atalho que permite evitar ter de preocupar-se com ponteiros. A declaração a seguir cria uma variável n1 e uma segunda referência à mesma n1 mas com um novo nome, nREF:

int n1 - // declarar um variableint int& Nref = N1 - // declarar uma segunda referência a n1nRef = 1- // agora aceder a referência // tem o mesmo efeito que n1 aceder - // n1 é agora igual a 1

Uma variável de referência como nREF deve ser inicializado quando é declarada porque cada vez subseqüente que seu nome é usado, C ++ irá assumir que você quer dizer a variável que nREF refere-se a.

variáveis ​​de referência encontram a sua principal aplicação em chamadas de função:

fn void (int& rnArg) // declarar argumento de referência {rnArg = 10 - // alterar o valor da variável ...} //...that rnArg refere pai tovoid (void) {int n1 = 0-fn (n1) - // passar uma referência a // n1 aqui o valor de n1 é 10}

Isso é chamado passando por referência. A declaração int& rnArg declara rnArg a ser uma referência a um argumento inteiro. o fn () função armazena o valor 10 para o int local referenciado por rnArg.

Video: Programar em C - Ponteiros à Estruturas - Aula 63

Passando pela referência é o mesmo que passar o endereço de uma variável. A sintaxe de referência coloca o ônus sobre C ++ para aplicar o “endereço de” operador de referência em vez de exigir que o programador para fazer isso.

Você não pode sobrecarregar um passe pela função de valor com a sua passagem pelo equivalente de referência. Assim, você não pode definir as duas funções fn (int) e fn (int&) no mesmo programa. C ++ não sabe qual a chamada.


Publicações relacionadas