Pointeurs C (avec exemples)

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, &varvous 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 inttype.

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 cest 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, *pcnous 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, *pcnous donne 5.

Ensuite, l'adresse de d est attribuée au pointeur pc en utilisant pc = &d;. Puisque d est -15, *pcnous 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

  1. int* pc, c;

    Here, a pointer pc and a normal variable c, both of type int, 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.
  2. c = 22;

    This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.
  3. pc = &c;

    This assigns the address of variable c to the pointer pc.
  4. c = 11;

    This assigns 11 to variable c.
  5. *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.

Articles intéressants...