C - Pointeurs

Les pointeurs en C sont faciles et amusants à apprendre. Certaines tâches de programmation C sont exécutées plus facilement avec des pointeurs, et d'autres tâches, telles que l'allocation de mémoire dynamique, ne peuvent pas être effectuées sans l'utilisation de pointeurs. Il devient donc nécessaire d'apprendre les pointeurs pour devenir un programmeur C parfait. Commençons à les apprendre par étapes simples et faciles.

Comme vous le savez, chaque variable est un emplacement de mémoire et chaque emplacement de mémoire a son adresse définie, accessible à l'aide de l'opérateur perluète (&), qui indique une adresse en mémoire. Prenons l'exemple suivant, qui imprime l'adresse des variables définies -

#include <stdio.h>

int main () {

   int  var1;
   char var2[10];

   printf("Address of var1 variable: %x\n", &var1  );
   printf("Address of var2 variable: %x\n", &var2  );

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

Que sont les pointeurs?

UNE pointerest une variable dont la valeur est l'adresse d'une autre variable, c'est-à-dire l'adresse directe de l'emplacement mémoire. Comme toute variable ou constante, vous devez déclarer un pointeur avant de l'utiliser pour stocker une adresse de variable. La forme générale d'une déclaration de variable de pointeur est -

type *var-name;

Ici, typeest le type de base du pointeur; il doit s'agir d'un type de données C valide etvar-nameest le nom de la variable du pointeur. L'astérisque * utilisé pour déclarer un pointeur est le même astérisque que celui utilisé pour la multiplication. Cependant, dans cette instruction, l'astérisque est utilisé pour désigner une variable comme pointeur. Jetez un œil à certaines des déclarations de pointeur valides -

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

Le type de données réel de la valeur de tous les pointeurs, qu'il soit entier, flottant, caractère ou autre, est le même, un long nombre hexadécimal qui représente une adresse mémoire. La seule différence entre les pointeurs de différents types de données est le type de données de la variable ou de la constante vers laquelle pointe le pointeur.

Comment utiliser les pointeurs?

Il y a quelques opérations importantes, que nous ferons très fréquemment à l'aide de pointeurs. (a) Nous définissons une variable de pointeur, (b) affecter l'adresse d'une variable à un pointeur et (c)enfin accéder à la valeur à l'adresse disponible dans la variable pointeur. Ceci est fait en utilisant un opérateur unaire*qui renvoie la valeur de la variable située à l'adresse spécifiée par son opérande. L'exemple suivant utilise ces opérations -

#include <stdio.h>

int main () {

   int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/

   printf("Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   printf("Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   printf("Value of *ip variable: %d\n", *ip );

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

Pointeurs NULL

Il est toujours recommandé d'attribuer une valeur NULL à une variable de pointeur au cas où vous n'auriez pas d'adresse exacte à attribuer. Cela se fait au moment de la déclaration des variables. Un pointeur qui est assigné NULL est appelé unnull aiguille.

Le pointeur NULL est une constante avec une valeur de zéro définie dans plusieurs bibliothèques standard. Considérez le programme suivant -

#include <stdio.h>

int main () {

   int  *ptr = NULL;

   printf("The value of ptr is : %x\n", ptr  );
 
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

The value of ptr is 0

Dans la plupart des systèmes d'exploitation, les programmes ne sont pas autorisés à accéder à la mémoire à l'adresse 0 car cette mémoire est réservée par le système d'exploitation. Cependant, l'adresse mémoire 0 a une signification particulière; il signale que le pointeur n'est pas destiné à pointer vers un emplacement mémoire accessible. Mais par convention, si un pointeur contient la valeur nulle (zéro), il est supposé ne pointer vers rien.

Pour rechercher un pointeur nul, vous pouvez utiliser une instruction 'if' comme suit -

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

Pointeurs en détail

Les pointeurs ont des concepts nombreux mais simples et ils sont très importants pour la programmation en C. Les concepts de pointeurs importants suivants devraient être clairs pour tout programmeur C -

N ° Sr. Concept et description
1 Arithmétique du pointeur

Il existe quatre opérateurs arithmétiques qui peuvent être utilisés dans les pointeurs: ++, -, +, -

2 Tableau de pointeurs

Vous pouvez définir des tableaux pour contenir un certain nombre de pointeurs.

3 Pointeur vers pointeur

C vous permet d'avoir un pointeur sur un pointeur et ainsi de suite.

4 Passer des pointeurs vers des fonctions en C

Le passage d'un argument par référence ou par adresse permet de modifier l'argument passé dans la fonction appelante par la fonction appelée.

5 Renvoie le pointeur des fonctions en C

C permet à une fonction de renvoyer un pointeur vers la variable locale, la variable statique et la mémoire allouée dynamiquement.