[L'âme du langage C] - pointeur (2)

teneur

opérations de pointeur

pointeur + - entier

pointeur - pointeur

Implémenter la fonction strlen avec la méthode pointeur-pointeur

pointeurs et tableaux

pointeur secondaire

tableau de pointeurs

pointeur de tableau


opérations de pointeur

pointeur + - entier

Pointer + - Integer est le nombre d'octets à ignorer lors de l'accès à la mémoire. Il a déjà été introduit, je n'en parlerai donc pas ici.

pointeur (1)

pointeur - pointeur

Cette chose est très courante dans les tableaux, pointeur-pointeur représente le nombre d'éléments entre deux pointeurs

Juste comme ça, adresse basse - adresse haute, deviendra négatif.

Implémenter la fonction strlen avec la méthode pointeur-pointeur

#include <stdio.h>
#include <assert.h>
 
int my_strlen(const char* str)
{
	assert(str);//判断指针是否错误
	char* tmp = str;
	while (*++tmp)
	{
		;
	}
	return tmp - str;
}

J'ai également écrit l'implémentation de nombreuses fonctions de la bibliothèque, vous pouvez y jeter un œil quand vous avez le temps :    Implémentation de diverses fonctions de la bibliothèque

pointeurs et tableaux

Cela ressort du débogage : le nom du tableau et l'adresse du premier élément du tableau sont identiques,
donc : le nom du tableau représente l'adresse du premier élément du tableau.

Sauf 2 cas

1.sizeof(arr) Le nom du tableau à ce moment représente le tableau entier, c'est-à-dire que le nom du tableau placé dans sizeof seul représente le tableau entier

2. &arr C'est le nom du tableau qui représente également l'ensemble du tableau, et l'adresse de l'ensemble du tableau est extraite

 Étant donné que le nom du tableau peut être stocké dans un pointeur en tant qu'adresse, nous utilisons le pointeur pour accéder à chaque élément du tableau.

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

 résultat de l'opération :

 Donc p+i accède en fait à l'adresse de l'indice i du tableau arr, et on peut accéder au contenu du tableau en le déréférencant.

Ensuite, nous pouvons accéder au tableau directement via le pointeur

int main()
{
	int arr[] = { 0,1,2,3,4 };
	int* p = arr; 
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

En fait, lorsque nous accédons au tableau arr[i] , le compilateur le transformera en *(arr+i) , donc l'accès au pointeur est le même que l'accès au tableau,

pointeur secondaire

La variable de pointeur a également sa propre adresse, alors pouvons-nous enregistrer l'adresse du pointeur ? Oui. Il s'agit du pointeur secondaire.

Si vous enregistrez l'adresse du pointeur de deuxième niveau, il devient un pointeur de troisième niveau (et le quatrième niveau, le cinquième niveau .... peuvent être imbriqués à l'infini)

L'adresse de a est stockée dans pa, et l'adresse de pa est stockée dans ppa.

pa est un pointeur de premier niveau, ppa est un pointeur de second niveau.

*ppa déréférence l'adresse dans ppa pour trouver pa, et *ppa accède réellement à pa.

Le déréférencement de l'adresse dans pa trouvera un ; vous pouvez également **ppa . Cela vous permettra également d'accéder à un .

tableau de pointeurs

Un tableau de pointeurs est un tableau de variables pointeur .

Les éléments du tableau peuvent être des entiers, des types à virgule flottante, des types de caractères... Les pointeurs sont également un type et peuvent également être stockés dans un tableau. Il s'agit d'un tableau de types de pointeurs (appelé tableau de pointeurs).

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = 40;
	int e = 50;
	int* arr[5] = { &a,&b,&c,&d,&e };//存放整型指针的数组
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", *(arr[i]));//依次对数组中的指针进行访问
	}
	return 0;
}

 

pointeur de tableau

Un pointeur de tableau est un pointeur qui stocke l'adresse du tableau entier .

Comme nous l'avons dit précédemment, différents types de variables de pointeur accèdent à différentes tailles de mémoire en même temps, et nous devons parfois accéder à l'ensemble du tableau

Il est nécessaire d'utiliser un pointeur de tableau Si le tableau doit stocker des entiers, alors le type du pointeur de tableau est int(*)[ ].

Je suppose que tu aimes

Origine blog.csdn.net/qq_54880517/article/details/123910225
conseillé
Classement