web-dev-qa-db-fra.com

Impression d'adresse de pointeur C

J'apprends pour la première fois à connaître les pointeurs et les adresses C et à les utiliser sur ma tablette

Disons:

int x = 1, y = 2;

int *ip; // declares *ip as an int type?

ip = &x; //assigns the address of x to ip?

y = *ip; //y is now 1 via dereferencing

Toutes les explications de commentaires sont-elles correctes?

Que se passe-t-il si j'imprime le résultat de l'ip? Imprimera-t-il l'adresse de la variable x, quelque chose comme 

011001110

11
Robert Rocha

Oui. Toutes vos déclarations sont correctes. Cependant en cas de première 

int *ip;

il vaut mieux dire que ip est un pointeur sur un type int

Que se passe-t-il si j'imprime le résultat de l'ip? 

Il affichera l’adresse de x

Imprimera-t-il l'adresse de la variable x, quelque chose comme

011001110  

Les adresses sont généralement représentées en hexadécimal. Vous devez utiliser le spécificateur %p pour imprimer l'adresse. 

printf("Address of x is %p\n", (void *)ip);  

REMARQUE:
Notez que dans la déclaration ci-dessus, * n'est pas l'opérateur d'indirection. Au lieu de cela, il spécifie le type de p, indiquant au compilateur que p est un pointeur sur int. Le symbole * n'effectue l'indirection que lorsqu'il apparaît dans une instruction.

29
haccks
int x = 1, y = 2;

int *ip; // declares ip as a pointer to an int (holds an address of an int)

ip = &x; // ip now holds the address of x

y = *ip; // y now equals the value held at the address in ip
3
Andrew L

Considérez ce qui suit comme exemple:

Initialiseur        x y ip 
Valeur de la mémoire       [1] [2] [1000] 
Adresse mémoire     1000 1004 1008 

Comme vous pouvez le voir:

  1. x a la valeur 1 et l'adresse 1000
  2. y a la valeur 2 et l'adresse 1004
  3. ip a la valeur 1000 (l'adresse de x) et l'adresse 1008

Considérer ce qui suit:

  1. x == 1 et &x == 1000
  2. y == 2 et &y == 1004
  3. ip == 1000 et &ip == 1008 et *ip == 1 (la valeur de x)

J'espère que cela vous aide à visualiser ce qui se passe.

2
Fiddling Bits

Tout est correct 

1ère ligne: vous déclarez deux variables

2ème ligne: un pointeur de mémoire "ip" est défini

3ème ligne: L'adresse mémoire de X est donnée au pointeur ip

4ème ligne: Y est maintenant défini sur la valeur de la variable X à l'adresse ip

L'adresse mémoire, toutefois, est au format hexadécimal. 011001110 est un octet de données et non une adresse de mémoire. L'adresse sera probablement quelque chose comme 0x000000000022FE38 (elle peut être plus courte). Considère ceci:

int x = 0;
int *ptr = &x; //the "&" character means "the address of"
printf("The variable X is at 0x%p and has the value of %i", (void *)ptr, x);

Ceci afficherait l'adresse de X plutôt que de * ptr. Vous aurez besoin d'un autre pointeur pour imprimer l'adresse de * ptr. Mais c'est plutôt inutile, car un pointeur est défini pour imprimer l'adresse d'une variable. Considérez-le comme un alias pour une autre variable (sa valeur est la valeur de cette adresse mémoire).

0
Adrian Zhang