Pointeur C
Apprendre des pointeurs en C est facile et amusant. Les pointeurs simplifient l'exécution de certaines tâches de programmation C, et certaines tâches, telles que l'allocation dynamique de mémoire, ne peuvent pas être effectuées sans pointeurs. Par conséquent, si vous voulez devenir un excellent programmeur C, il est nécessaire d’apprendre les pointeurs.
Comme vous le savez, chaque variable a un emplacement mémoire, et chaque emplacement mémoire définit une adresse accessible à l'aide de l'opérateur tiret (&), qui représente une adresse en mémoire. Veuillez regarder l'exemple suivant, qui affichera l'adresse de variable définie :
#include <stdio.h>int main (){ int var1; char var2[10]; printf("var1 变量的地址: %x\n", &var1 ); printf("var2 变量的地址: %x\n", &var2 ); return 0;}
Lorsque le code ci-dessus est compilé et exécuté, il produira les résultats suivants :
var1 变量的地址: bff5a400 var2 变量的地址: bff5a3f6
Grâce à l'exemple ci-dessus, nous Apprenons ce qu'est une adresse mémoire et comment y accéder. Voyons ensuite ce que sont les pointeurs.
Qu'est-ce qu'un pointeur ?
Un pointeur est une variable dont la valeur est l'adresse d'une autre variable, c'est-à-dire l'adresse directe d'un emplacement mémoire. Comme toute autre variable ou constante, vous devez déclarer un pointeur avant de l'utiliser pour stocker l'adresse d'une autre variable. La forme générale de déclaration de variable de pointeur est :
type *var-name;
Ici, type est le type de base du pointeur, qui doit être un type de données C valide, var-name est le nom de la variable pointeur. L'astérisque * utilisé pour déclarer les pointeurs est le même que celui utilisé dans la multiplication. Cependant, dans cette instruction, l'astérisque est utilisé pour spécifier qu'une variable est un pointeur. Ce qui suit est une déclaration de pointeur valide :
int *ip; /* 一个整型的指针 */double *dp; /* 一个 double 型的指针 */float *fp; /* 一个浮点型的指针 */char *ch /* 一个字符型的指针 */
Les types de données réels de toutes les valeurs de pointeur, qu'elles soient entières, à virgule flottante, caractères ou autres types de données, sont les mêmes et représentent le même nombre hexadécimal long d'adresse mémoire . La seule différence entre les pointeurs de différents types de données réside dans le type de données de la variable ou de la constante pointée par le pointeur.
Comment utiliser les pointeurs ?
Lors de l'utilisation de pointeurs, les opérations suivantes sont fréquemment effectuées : définir une variable de pointeur, attribuer l'adresse de variable au pointeur et accéder à la valeur de l'adresse disponible dans la variable de pointeur. Celles-ci sont effectuées en utilisant l'opérateur unaire * pour renvoyer la valeur de la variable située à l'adresse spécifiée par l'opérande. L'exemple suivant implique ces opérations :
#include <stdio.h>int main (){ int var = 20; /* 实际变量的声明 */ int *ip; /* 指针变量的声明 */ ip = &var; /* 在指针变量中存储 var 的地址 */ printf("Address of var variable: %x\n", &var ); /* 在指针变量中存储的地址 */ printf("Address stored in ip variable: %x\n", ip ); /* 使用指针访问值 */ printf("Value of *ip variable: %d\n", *ip ); return 0;}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
Address of var variable: bffd8b3cAddress stored in ip variable: bffd8b3cValue of *ip variable: 20
Le pointeur NULL dans C
in Lors de la déclaration une variable, s'il n'y a pas d'adresse exacte à laquelle attribuer une valeur, c'est une bonne pratique de programmation d'attribuer une valeur NULL à la variable de pointeur. Un pointeur auquel une valeur NULL est attribuée est appelé un pointeur null.
Le pointeur NULL est une constante définie dans la bibliothèque standard avec une valeur nulle. Veuillez regarder le programme suivant :
#include <stdio.h>int main (){ int *ptr = NULL; printf("ptr 的值是 %x\n", ptr ); return 0;}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
ptr 的值是 0
Sur la plupart des systèmes d'exploitation, le programme n'est pas autorisé à accéder à l'adresse 0 de mémoire 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 car elle indique que le pointeur ne pointe pas vers un emplacement mémoire accessible. Mais par convention, si un pointeur contient null (valeur zéro), il est supposé ne pointer vers rien.
Pour rechercher un pointeur nul, vous pouvez utiliser l'instruction if, comme indiqué ci-dessous :
if(ptr) /* 如果 p 非空,则完成 */if(!ptr) /* 如果 p 为空,则完成 */
Explication détaillée des pointeurs C
En C, il existe de nombreux pointeurs- concepts connexes. Ces concepts sont simples, mais importants. Vous trouverez ci-dessous quelques concepts importants liés aux pointeurs que les programmeurs C doivent connaître :
概念 | 描述 |
---|---|
指针的算术运算 | 可以对指针进行四种算术运算:++、--、+、- |
指针数组 | 可以定义用来存储指针的数组。 |
指向指针的指针 | C 允许指向指针的指针。 |
传递指针给函数 | 通过引用或地址传递参数,使传递的参数在调用函数中被改变。 |
从函数返回指针 | C 允许函数返回指针到局部变量、静态变量和动态内存分配。 |