Dans ce didacticiel, vous découvrirez les pointeurs; quels sont les pointeurs, comment les utilisez-vous et les erreurs courantes que vous pourriez rencontrer en travaillant avec eux à l'aide d'exemples.
Les pointeurs sont des fonctionnalités puissantes de la programmation C et C ++. Avant d'apprendre les pointeurs, apprenons les adresses en programmation C.
Adresse en C
Si vous avez une variable var dans votre programme, &var
vous donnera son adresse en mémoire.
Nous avons utilisé l'adresse à plusieurs reprises lors de l'utilisation de la scanf()
fonction.
scanf("%d", &var);
Ici, la valeur saisie par l'utilisateur est stockée dans l'adresse de la variable var. Prenons un exemple de travail.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Production
var: 5 adresse de var: 2686778
Remarque: vous obtiendrez probablement une adresse différente lorsque vous exécuterez le code ci-dessus.
Pointeurs C
Les pointeurs (variables de pointeur) sont des variables spéciales utilisées pour stocker des adresses plutôt que des valeurs.
Syntaxe du pointeur
Voici comment déclarer des pointeurs.
int* p;
Ici, nous avons déclaré un pointeur p de int
type.
Vous pouvez également déclarer des pointeurs de cette manière.
int *p1; int * p2;
Prenons un autre exemple de déclaration de pointeurs.
int* p1, p2;
Ici, nous avons déclaré un pointeur p1 et une variable normale p2.
Attribution d'adresses aux pointeurs
Prenons un exemple.
int* pc, c; c = 5; pc = &c;
Ici, 5 est affecté à la variable c. Et, l'adresse de c est attribuée au pointeur pc.
Obtenez la valeur de la chose pointée par des pointeurs
Pour obtenir la valeur de l'objet pointé par les pointeurs, nous utilisons l' *
opérateur. Par exemple:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Ici, l'adresse de c
est attribuée au pointeur pc. Pour obtenir la valeur stockée dans cette adresse, nous avons utilisé * pc.
Remarque: dans l'exemple ci-dessus, pc est un pointeur, pas *pc
. Vous ne pouvez pas et ne devez pas faire quelque chose comme *pc = &c
;
À propos, *
est appelé l'opérateur de déréférence (lorsque vous travaillez avec des pointeurs). Il opère sur un pointeur et donne la valeur stockée dans ce pointeur.
Modification de la valeur pointée par des pointeurs
Prenons un exemple.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Nous avons attribué l'adresse de c au pointeur pc.
Ensuite, nous avons changé la valeur de c en 1. Puisque pc et l'adresse de c sont les mêmes, *pc
nous donne 1.
Prenons un autre exemple.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Nous avons attribué l'adresse de c au pointeur pc.
Ensuite, nous sommes passés *pc
à 1 en utilisant *pc = 1;
. Puisque pc et l'adresse de c sont identiques, c sera égal à 1.
Prenons un autre exemple.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Initialement, l'adresse de c est attribuée au pointeur pc à l'aide de pc = &c;
. Puisque c est 5, *pc
nous donne 5.
Ensuite, l'adresse de d est attribuée au pointeur pc en utilisant pc = &d;
. Puisque d est -15, *pc
nous donne -15.
Exemple: fonctionnement des pointeurs
Prenons un exemple de travail.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Production
Adresse de c: 2686784 Valeur de c: 22 Adresse du pointeur pc: 2686784 Contenu du pointeur pc: 22 Adresse du pointeur pc: 2686784 Contenu du pointeur pc: 11 Adresse de c: 2686784 Valeur de c: 2
Explication du programme
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
Dans les deux cas, nous créons p
(non *p
) un pointeur et nous lui assignons &c
.
Pour éviter cette confusion, nous pouvons utiliser l'instruction comme ceci:
int* p = &c;
Maintenant que vous savez ce que sont les pointeurs, vous apprendrez comment les pointeurs sont liés aux tableaux dans le prochain didacticiel.