Pergunta

A partir das notas de palestras de um curso na Universidade, em "Call-By-Value":

void fun(int *ip)

{

*ip =100;

}

chamado por

int n=2;  

int *np;

np = &n; 

fun(np);

mudaria o valor de n para 100.

Quando dizemos "int *ip", o que exatamente queremos dizer? Um ponteiro do tipo inteiro? Em caso afirmativo, quando chamamos Fun () com NP como argumento, não deveria haver um erro, pois o NP tem o endereço de n, que não é um número inteiro?

E então, alteramos o valor de IP para 100, então isso não significa que N agora tem o valor que está no "slot de memória" com o endereço 100? Tenho certeza de que estou perdendo alguma coisa. :)

Foi útil?

Solução

Um ponteiro do tipo inteiro?

Não, um ponteiro para um número inteiro.

Quando chamamos de diversão () com o NP como argumento, não deveria haver um erro, pois o NP tem o endereço de n, que não é um número inteiro?

n é um número inteiro, então não há problema. &n, np e ip Todos têm o mesmo tipo em seu código: int*.

E então, mudamos o valor de IP para 100

Não ... nós mudamos o valor de *ip, não de ip. Isto é, mudamos o valor que ip aponta para (que também às vezes é chamado de Pointee).

Outras dicas

Sim quando você usa int * como um tipo de parâmetro de fun Você está dizendo que aceita um ponteiro para um int. Desde np é um ponteiro para um int passando para fun está ok.

np e ip estão apontando para o endereço de n, então quando você atribui um valor como *ip = 42, ele atribuirá o valor de 42 ao local da memória que ip está apontando - o que é n.

O que você tem no código de amostra é chamado Passe por ponteiro. Sua função tem um parâmetro do tipo ponteiro para inteiro. Portanto, o valor passado para a função é o endereço da variável n. A função atribui 100 para a variável (ou seja, um local de memória) apontado para pelo parâmetro de ponteiro ip. A estrela * é o Operador de Dereferência em C/C ++.

Em diversão (), você não está alterando o valor de IP para 100, está alterando o local da memória apontado pelo IP.

type* usado como tipo significa "um ponteiro para esse tipo"

uso comum é int *var, mas eu gosto de escrever como int* var como isso o torna uma distinção melhor de desreferenciar um ponteiro, ou seja, *ptr.

assim int* a significa que A é um ponteiro para um objeto do tipo int, *a significa o objeto apontado por A e &a significa o endereço do objeto a.

Imagine np a partir do tipo int*. Tenha em mente que, para esse fim, o asterisco e o int Juntos, faça um tipo "ponteiro para int" e não é separável.

ip é um ponteiro, com ip* Você acessa o "slot de memória" para o qual está apontando. np também é um ponteiro. Usando &n Você atribui o endereço do slot de memória de n para np. Então, ao ligar fun(), lado de dentro fun() O único slot de memória que é acessado é o de n e assim para n 100 está atribuído.

Alguma confusão é possível aqui porque os números da loja N e NP - no entanto, ao compilar, o compilador usará os números de maneira diferente; isto é, enquanto

n++;

e

np++;

são realmente operações aritméticas, a montagem gerada é diferente. É importante lembrar que, em última análise, todos os dados do computador são números. Eles se tornam diferentes tipos de dados apenas porque os tratamos de maneira diferente.

Especificamente com relação ao seu exemplo,

*np = 100;

você precisa se lembrar que o * significa desreferência, e essa operação ocorre antes da tarefa. Pode ser mais claro com parênteses supérfluos:

(* (np) ) = 100;

ou em um contexto diferente:

int n = *np;

Agora, devo dizer, isso aquece meu coração quando você diz,

Mudamos o valor de IP para 100, então isso não significa que N agora tem o valor que está no "slot de memória" com o endereço 100? como esconde o que considero um entendimento importante. No entanto, acredito que estou certo quando digo, você deve sair do seu caminho para fazer esse tipo de coisa para os ponteiros:

static_cast<int>(np) = 100;

Isso faria o que você descreveu, porque diz ao computador para tratar o número que é NP como um tipo diferente de número; Da mesma maneira que static_cast<char*>(np) trataria o número NP aponta como personagem, e não como um número inteiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top