Utiliser l'esperluette de pointeur et la notation en C
-
Utiliser la notation
&var
pour obtenir l’adresse d’une variable donnée -
Utiliser la notation
*ptr
pour accéder à la valeur de la variable du pointeur -
Utiliser l’esperluette et la notation
&
pour passer l’adresse des objets aux fonctions
Cet article présente plusieurs méthodes pour utiliser l’esperluette de pointeur et la notation en C.
Utiliser la notation &var
pour obtenir l’adresse d’une variable donnée
Les pointeurs sont simplement des variables contenant les adresses mémoire. Ils sont déclarés avec la notation type *var
. On peut attribuer au pointeur n’importe quelle adresse du même type, et tout type de pointeur peut stocker le pointeur void*
, qui est appelé pointeur générique. Puisque nous avons un type qui stocke les adresses des objets, il devrait y avoir un opérateur qui donne accès à l’un d’entre eux.
L’esperluette &
est utilisée comme un opérateur unaire souvent appelé opérateur “adresse de”. Il peut être utilisé sur des objets de données et des fonctions pour récupérer l’adresse à laquelle l’objet est stocké.
Supposons que nous ayons un entier x
déclaré et initialisé comme indiqué dans l’exemple suivant. Dans ce cas, nous pouvons prendre son adresse avec l’opérateur esperluette &
et l’affecter à la variable int *xptr
. En conséquence, xptr
pointe vers la valeur 10233, et l’opérateur *
peut être utilisé pour accéder à sa valeur dans le code suivant.
Notez que l’astérisque *
est utilisé dans deux contextes différents ici. Le premier consiste à déclarer une variable de type pointeur. L’autre est d’accéder à la valeur de du pointeur à la variable, cette dernière étant appelée déréférencement.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
printf("x: %d\n", x);
printf("*xptr: %d\n", *xptr);
exit(EXIT_SUCCESS);
}
Production :
x: 10233
*xptr: 10233
Utiliser la notation *ptr
pour accéder à la valeur de la variable du pointeur
L’opérateur de déréférencement peut être utilisé pour récupérer les valeurs des pointeurs et les affecter à des variables du même type. Notez que l’opérateur *
ne peut pas être utilisé avec des pointeurs null
ou invalides car il entraîne un comportement indéfini. Dans la plupart des scénarios, si l’on essaie le pointeur null
, le programme risque de planter. Mais si l’on accède au pointeur invalide, il peut passer inaperçu. Un pointeur invalide peut pointer vers un objet arbitraire en mémoire, et les opérations sur cet objet continueront, mais il peut endommager l’état correct du programme.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
int y = *xptr; // y now holds the value 10233
printf("x: %d\n", x);
printf("y: %d\n", y);
exit(EXIT_SUCCESS);
}
Production :
x: 10233
y: 10233
Utiliser l’esperluette et la notation &
pour passer l’adresse des objets aux fonctions
L’exemple le plus courant de l’utilisation de l’opérateur adresse-de est de passer un pointeur vers l’objet comme argument de fonction. L’exemple suivant montre la fonction swap
qui prend deux pointeurs entiers comme arguments. Remarquez que lorsque la fonction swap
est appelée depuis la fonction main
, l’opérateur esperluette est utilisé pour passer les adresses des variables x
et y
. Mais attention, l’opérateur *
dans le corps de la fonction swap
indique la déréférence du pointeur.
#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int x = 10233;
int y = 10133;
printf("x:%d, y:%d\n", x, y);
swap(&x, &y);
printf("x:%d, y:%d\n", x, y);
exit(EXIT_SUCCESS);
}
Production :
x:10233, y:10133
x:10133, y:10233
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook