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
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.
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
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:
x
a la valeur 1
et l'adresse 1000
y
a la valeur 2
et l'adresse 1004
ip
a la valeur 1000
(l'adresse de x
) et l'adresse 1008
Considérer ce qui suit:
x == 1
et &x == 1000
y == 2
et &y == 1004
ip == 1000
et &ip == 1008
et *ip == 1
(la valeur de x
)J'espère que cela vous aide à visualiser ce qui se passe.
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).