[Base du langage C 11 - pointeur (2)]


avant-propos

Cet article poursuit le contenu précédent et continue d'en savoir plus sur les points de connaissance liés aux pointeurs.


4. Fonctionnement du pointeur

  • pointeur±entier
  • pointeur - pointeur
  • Opérations relationnelles sur les pointeurs

4.1 Pointeur ± Entier

#define VALUE 5
int main()
{
    
    
	float values[VALUE];
	float *vp;
	//指针+-指针,关系运算
	for (vp = &values[0]; vp < &values[VALUE];)
	{
    
    
		*vp++ = 0;//通过这样完成初始化
	}
	for (int i = 0; i < VALUE; i++)
	{
    
    
		printf("%d ", values[i]);
	}
	return 0;
}

insérez la description de l'image ici

4.2 Pointeur-Pointeur

int main()
{
    
    
	int arr[10] = {
    
     0 };
	printf("%d\n", &arr[9] - &arr[0]);//得到元素的个数
	printf("%d\n", sizeof(arr)/sizeof(arr[0]));//计算元素个数
	int* p0 = &arr[0];
	int* p9 = &arr[9];
	printf("%d\n", (p9 - p0));//得到元素的个数
	return 0;
}

En soustrayant les adresses des premier et dernier éléments du tableau, on obtient le nombre d'éléments du tableau.

-int* indique que l'adresse pointée par le pointeur, le type de données stocké est un entier, occupant 4 octets

  • L'adresse de l'élément de tableau +1 sert à trouver l'adresse de l'élément suivant, et il se déplacera de 4 octets
    insérez la description de l'image ici
    . Ce phénomène s'observe plus clairement grâce au débogage. Chaque élément du tableau int occupe quatre octets :
  • &arr[0]: 0x005cf7f8
  • &arr[0]+1 : 0x005cf7fc, l'adresse est déplacée de 1 bit, c'est-à-dire que le pointeur int* est déplacé de 1 bit et les octets sont augmentés de 4.
    insérez la description de l'image ici
    Précondition : Les deux pointeurs doivent pointer sur le même espace :
char ch[5];
int arr[6];
%arr[4]-&ch[3];//错误的

L'article précédent a présenté la méthode de longueur de chaîne de deux manières :

  • cycle
  • récursivité

La troisième méthode est introduite ici, le pointeur

int mylen(char* pa)//传参是数组首元素的地址
{
    
    
	char* p = pa;//首元素地址
	while (*pa)//元素不是‘0’
	{
    
    
		pa++;//通过地址访问字符串
	}
	//结尾字符0的地址减首元素地址
	return pa - p;//指针相减是元素的个数
}
int main()
{
    
    
	char arr[] = "abcdef";
	int len = mylen(arr);
	printf("%d", len);
	return 0;
}

4.3 Opérations relationnelles sur les pointeurs

Les états standard : un pointeur vers un élément de tableau est autorisé à comparer avec un pointeur vers un emplacement mémoire après le dernier élément du tableau, mais la comparaison avec un
pointeur vers un emplacement mémoire avant le premier élément n'est pas autorisée

int main()
{
    
    
	//
	for (vp = &values[5]; vp > &values[0];)
	{
    
    
		*--vp = 0;
	}
	for (vp = &values[5-1]; vp >= &values[0];vp--)//不允许
	//地址会指向首元素前面的地址,这是不允许的
	{
    
    
		*vp = 0;
	}
	return 0;
}

5. Pointeurs et tableaux

int main()
{
    
    
	int arr[10] = {
    
    1,2,3,4,5,6,7,8,9,0};
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);
	int *p = arr;//p存放的是数组首元素的地址
	return 0;
}

Le nom du tableau est le même que l'adresse du premier élément du tableau. Le nom du tableau représente l'adresse du premier élément du tableau. (Sauf pour 2 cas, les articles de la série tableau sont présentés en détail)
insérez la description de l'image ici
Puisque le nom du tableau peut être stocké dans un pointeur en tant qu'adresse, il nous est possible d'utiliser le pointeur pour accéder à un

int main()
{
    
    
	int arr[] = {
    
    1,2,3,4,5,6,7,8,9,0};
	int *p = arr; //指针存放数组首元素的地址
	int sz = sizeof(arr)/sizeof(arr[0]);
	for(int i=0; i<sz; i++)
	{
    
    
		printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i);
	}
	return 0;
}

insérez la description de l'image ici
Observez la figure ci-dessus, donc p+i calcule en fait l'adresse de l'élément dont l'index est i dans le tableau arr. Ensuite, vous pouvez accéder au tableau directement via le pointeur :

int main()
{
    
    
	int arr[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
    
    
		printf("%d ",*(p + i));
	}
	printf("\n");
	for (int i = 0; i < sz; i++)
	{
    
    
		printf("%d ", *(p++));
	}
	printf("\n");
	for (int i = 0; i < sz; i++)
	{
    
    
		printf("%d ", arr[i]);
	}
	return 0;
}

insérez la description de l'image ici

6. Pointeur secondaire

Une variable de pointeur est également une variable, et une variable a une adresse. Où est stockée l'adresse de la variable de pointeur ? C'est le pointeur secondaire

int main()
{
    
    
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	return 0;
}
  • L'adresse de a est stockée dans le pointeur pa, qui est un pointeur de premier niveau
  • L'adresse de pa est stockée dans ppa, qui est un pointeur secondaire
    insérez la description de l'image ici

Les opérations pour les pointeurs secondaires sont :

  • *ppa déréférence l'adresse dans ppa pour trouver pa, et *ppa accède réellement à pa.
int b = 20;
*ppa = &b;//等价于 pa = &b;
  • **ppa trouve d'abord pa via *ppa, puis déréférence pa : *pa, qui trouve a
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

7. Tableau de pointeurs

Un tableau de pointeurs est-il un pointeur ou un tableau ?

  • est un tableau. est un tableau de pointeurs

Dans les articles de la série de tableaux, des tableaux d'entiers, des tableaux de caractères ont été introduits :

int arr1[5];//占用20个字节
char arr2[5];//占用5个字节

insérez la description de l'image ici

7.1 Exemple 1

tableau de pointeurs :

int main()
{
    
    
	int data1[] = {
    
     1,2,3,4,5 };
	int data2[] = {
    
     2,3,4,5,6 };
	int data3[] = {
    
     3,4,5,6,7 };
	//看成二维数组
	int* arr[3] = {
    
     data1,data2,data3 };
	for (int i = 0; i < 3; i++)
	{
    
    
		for (int j = 0; j < 5; j++)
		{
    
    //[]是操作符
			printf("%d ", arr[i][j]);//不需要解引用
		}
		printf("\n");
	}
	   
	return 0;
}

arr3 est un tableau à cinq éléments, chaque élément est un pointeur entier, qui est une adresse :

  • arr[0], qui est l'élément data1, est une variable de pointeur, et est lui-même le nom du tableau d'un tableau unidimensionnel { 1,2,3,4,5 }, représentant l'adresse du premier élément
  • arr[1], l'élément data2, est une variable pointeur, qui est aussi le nom du tableau d'un tableau unidimensionnel { 2,3,4,5,6 }, représentant l'adresse du premier élément
  • arr[2], qui est l'élément data3, est une variable de pointeur, et est lui-même le nom du tableau du tableau unidimensionnel { 3,4,5,6,7 }, représentant l'adresse du premier élément

insérez la description de l'image ici
insérez la description de l'image ici
Il peut également être trouvé en déboguant :

  • Le premier élément du tableau de pointeurs, data, est une variable de pointeur et l'adresse du premier élément d'un tableau unidimensionnel.
  • Les éléments du tableau sont accessibles par le nom du tableau + i
  • Un tableau de pointeurs peut être vu comme un tableau à deux dimensions
arr[0]=data1;//指针数组首元素data,是指针变量,也是一维数组首元素的地址
arr[0][0]=data1[0];//看成一维数组
arr[0][1]=data1[1];
arr[0][2]=data1[2];
arr[0][3]=data1[3];
arr[0][4]=data1[4];

insérez la description de l'image ici
Le résultat de l'impression est illustré dans la figure ci-dessous :
insérez la description de l'image ici
le code est remplacé par l'effet suivant, et il est écrit du point de vue du déréférencement d'adresse :

int main()
{
    
    
	int data1[] = {
    
     1,2,3,4,5 };
	int data2[] = {
    
     2,3,4,5,6 };
	int data3[] = {
    
     3,4,5,6,7 };
	//看成二维数组
	int* arr[3] = {
    
     data1,data2,data3 };
	for (int i = 0; i < 3; i++)
	{
    
    
		for (int j = 0; j < 5; j++)
		{
    
    
			printf("%d ", *(arr[i]+j));//地址访问解引用
		}
		printf("\n");
	}   
	return 0;
}

insérez la description de l'image ici

7.2 Exemple 2

Les éléments du tableau de pointeurs sont des variables de pointeur, qui est l'adresse

int main()
{
    
    
	int a = 10;
	int b = 11;
	int c = 12;
	int d = 13;
	int e = 14;
	int* arr[5] = {
    
     &a,&b,&c,&d,&e };//指针数组存放的元素是指针变量,就是地址
	for (int  i = 0; i < 5; i++)
	{
    
    
		printf("%d ", *(arr[i]));//地址解引用
	}
	return 0;
}

insérez la description de l'image ici


Résumer

Cet article continue d'apprendre les points de connaissance liés aux pointeurs Les pointeurs sont la partie la plus importante du langage C. Au stade de base, l'apprentissage des pointeurs touche à sa fin.

Le prochain article apprendra les points de connaissance des structures.

Je suppose que tu aimes

Origine blog.csdn.net/taibudong1991/article/details/123963476
conseillé
Classement