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

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

Passando por valor em C ++

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

fn void (int Narg) {Narg = 10 - // valor da Narg neste momento é 10} pai (void) {int n1 = 0-fn (n1) - // valor do n1 neste momento ainda é 0}

aqui o parent () função inicializa a variável inteiro n1 para 0. O valor de n1 é então passado para fn (). Ao entrar na função, narg é igual a 0, o valor transmitido. fn () altera o valor de narg a 10 antes de retornar ao parent (). Ao voltar para parent (), o valor de n1 ainda é 0.

A razão para este comportamento é que C ++ não passar uma variável para 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 se é 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ínseco, um ponteiro pode ser passado como um argumento para uma função:

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

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

supor n está localizado no endereço de 0x100. Ao invés de o 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 parent (), 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 acessando - // n1 é agora igual a 1

A 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}

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

Passar por 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 # 147 endereço do # 148- operador de referência em vez de exigir que o programador fazê-lo.

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.

menu