Sur la différence entre un tableau de pointeur et un pointeur de tableau en langage Go

Je vous ai déjà présenté l'utilisation des pointeurs en détail, alors quel est le changement entre le soi-disant tableau de pointeurs et le pointeur de tableau, et quel est le lien entre eux? Qu'il s'agisse d'un sens ou de significations différentes, parlons-en ci-dessous.

Tableau de pointeurs

Tout d'abord, il s'agit d'un tableau. Les éléments du tableau sont des pointeurs. Le nombre d'octets que le tableau occupe est déterminé par la taille du tableau lui-même. Chaque élément est un pointeur. Dans un système 32 bits, tout type de pointeur occupe toujours 4 octets. . C'est l'abréviation de «tableau de pointeurs».

Pointeur de tableau

Tout d'abord, il s'agit d'un pointeur, qui pointe vers un tableau. Dans un système 32 bits, tout type de pointeur occupe toujours 4 octets. Quant au nombre d’octets vers lequel pointe le tableau, je ne sais pas, cela dépend de la taille du tableau. C'est l'abréviation de "pointer to array".

Lorsque le pointeur est à l'arrière, cela signifie qu'il s'agit d'un pointeur, pointant simplement vers un tableau;
lorsque le pointeur est à l'avant, cela signifie qu'il s'agit d'un tableau, mais les éléments du tableau sont tous des pointeurs.
Tout le monde devrait donc pouvoir comprendre de quoi je parle.

définition

Définition du pointeur de tableau (également appelé pointeur de ligne)

int (*p)[n]

() La priorité est élevée. Premièrement, p est un pointeur, pointant vers un tableau unidimensionnel entier. La longueur de ce tableau unidimensionnel est n, ce qui peut également être considéré comme la taille de pas de p. C'est-à-dire que lorsque p + 1 est exécuté, p doit couvrir la longueur de n données entières.

//定义二维数组
 int a[3][4];

//该语句是定义一个数组指针,指向含4个元素的一维数组。
 int (*p)[4]; 
      
//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p=a;  
    
//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
 p++;   

Par conséquent, les pointeurs de tableau sont également appelés pointeurs vers des tableaux unidimensionnels ou pointeurs de ligne.

Dans le tableau à deux dimensions
, les cinq valeurs de a, & a, a [0], & a [0] et a [0] [0] sont identiques et pointent toutes vers la première adresse (position de départ) du tableau à deux dimensions. La
différence réside dans ces cinq Les types d'expressions sont différents, prenez par exemple int a [2] [3]:

a est le nom du tableau à deux dimensions, qui est une constante, et stocke la première adresse du tableau à deux dimensions. Le type est un tableau à deux dimensions, sizeof (a) = 24

& a La (première) adresse du tableau bidimensionnel a, qui est lui-même un pointeur, sizeof (& a) = 4, le type de pointeur est 4

a [0] pointe vers la première ligne du tableau bidimensionnel a [0] [], le type est un tableau unidimensionnel sizeof (a [0]) = 12
& a [0] représente l'adresse d'un [0], et unidimensionnel Le nom du tableau a [0] a la même valeur, mais il s'agit d'un type de pointeur sizeof (& a [0]) = 4
& a [0] [0] représente l'adresse du premier élément d'un tableau à deux dimensions, et le type de pointeur sizeof (& a [0] [0]) = 4

Définition du tableau de pointeurs

 int *p[n]

[] Haute priorité, combinez d'abord avec p pour former un tableau, puis int * montre qu'il s'agit d'un tableau de pointeur entier, qui a n éléments de tableau de type pointeur. Lorsque p + 1 est exécuté ici, p pointe vers l'élément suivant du tableau.

L'affectation suivante est erronée:

p = a;

Parce que p est une représentation inconnaissable, seuls p [0], p [1], p [2] ... p [n-1] existent, et ce sont des variables de pointeur qui peuvent être utilisées pour stocker des adresses de variables.
Mais il peut être attribué comme suit:

* p = a;

Ici * p représente la valeur du premier élément du tableau de pointeurs, qui est la valeur de la première adresse de a.

Pour affecter un tableau à deux dimensions à un tableau de pointeurs:

int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]

Ici, int * p [3] signifie qu'il y a trois variables de pointeur stockées dans un tableau unidimensionnel, qui sont p [0], p [1], p [2]; par conséquent, attribuez des valeurs séparément.

Le pointeur de tableau n'est qu'une variable de pointeur. Il semble être utilisé spécifiquement pour pointer vers un tableau à deux dimensions en langage C. Il occupe l'espace de stockage d'un pointeur dans la mémoire.

Le tableau de pointeur est un certain nombre de variables de pointeur, stockées dans la mémoire sous la forme d'un tableau, occupant l'espace de stockage de plusieurs pointeurs.
Un autre point qui doit être expliqué est que lorsqu'il est utilisé pour pointer vers un tableau à deux dimensions en même temps, la référence est la même que la référence par le nom du tableau.
Par exemple, pour représenter un élément de la ligne i et de la colonne j du tableau:

*(p[i]+j)*(*(p+i)+j)(*(p+i))[j]、p[i][j]

Priorité: ()> []> *

Juger le tableau de pointeur et le pointeur de tableau en fonction de la priorité

Lequel des éléments suivants est un pointeur de tableau et lequel est un tableau de pointeurs?

A)
int *p1[10];

B)
int (*p2)[10];

Avant cela, vous devez comprendre la priorité d'un symbole.

Analysez d'abord la priorité de "[]" dans A) par rapport à "*".
p1 est d'abord combiné avec "[]" pour former la définition d'un tableau, le nom du tableau est p1, int * modifie le contenu du tableau, c'est-à-dire chaque élément du tableau. Nous pouvons maintenant comprendre qu'il s'agit d'un tableau, qui contient 10 pointeurs vers des données de type int, c'est-à-dire un tableau de pointeurs.

La réanalyse B) "()" a une priorité plus élevée que "[]".
Le signe "*" et p2 constituent la définition d'un pointeur. La variable du pointeur est nommée p2. Int modifie le contenu du tableau, c'est-à-dire chaque élément du tableau. Le tableau n'a pas de nom ici, c'est un tableau anonyme.
Nous savons maintenant que p2 est un pointeur, qui pointe vers un tableau contenant 10 données int, c'est-à-dire un pointeur de tableau.

Comme indiqué ci-dessous:
Insérez la description de l'image ici

Sur la différence entre a et & a

Pour illustrer la différence entre a et & a, le code est le suivant:

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[5] = &a;
   char (*p4)[5] = a;
   return 0;
}

Quelle sera la valeur de p3 + 1? Quelle sera la valeur de p4 + 1? Il ne fait aucun doute que p3 et p4 sont des pointeurs de tableau, pointant vers le tableau entier.
& a est la première adresse du tableau entier;
a est la première adresse du premier élément du tableau .

La valeur est la même mais la signification est complètement différente.
En langage C, les types de données des deux côtés du symbole d'affectation "=" doivent être identiques. S'ils sont différents, une conversion de type explicite ou implicite est requise.

Les types de données des deux côtés du "=" dans la définition de p3 sont exactement les mêmes, tandis que les types de données des deux côtés du "=" dans la définition de p4 sont incohérents.
Le type sur la gauche est un pointeur vers le tableau entier et le type de données sur la droite est un pointeur vers un seul caractère.

Maintenant qu'il est clair que p3 et p4 pointent vers le tableau entier, les valeurs de p3 + 1 et p4 + 1 sont faciles à comprendre.

Quel est le problème si vous modifiez la longueur du tableau en une taille plus petite? Quelles sont les valeurs de p3 + 1 et p4 + 1?

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[3] = &a;
   char (*p4)[3] = a;
   return 0;
}

Quel est le problème si la longueur du tableau est augmentée?

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[10] = &a;
   char (*p4)[10] = a;
   return 0;
}

Quelles sont les valeurs de p3 + 1 et p4 + 1 à ce moment?

Les résultats obtenus:
(1). char (*p2)[5]=a;
Une conversion forcée doit être utilisée, telle que:

char (*p2)[5]=(char (*)[5])a;

(2). Si la longueur du tableau est modifiée, le message d'erreur indiquant que la compilation échoue:

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[3]'

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[10]'

(3). Après avoir modifié le programme ci-dessus, le code à exécuter avec succès est le suivant:

int main()

{
    
    

  	char a[5]={
    
    'a','b','c','d'};

  	char (*p1)[5]= &a;

  	char (*p2)[5]=(char (*)[5])a;


  	printf("a=%d\n",a);

  	printf("a=%c\n",a[0]);

  	printf("p1=%c\n",**p1);

  	printf("p2=%c\n",**p2);

  	printf("p1+1=%c\n",**(p1+1));

  	printf("p2+1=%c\n",**(p2+1));


  	return 0;

}

résultat de l'opération:

a=1638208

a=a

p1=a

p2=a

p1+1=?

p2+1=?

Press any key to continue

Vous pouvez essayer les résultats plus tard et voir ce que vous obtenez.

en conclusion:

Selon le type de pointeur et l'objet pointé, il indique la taille du pointeur, et chaque fois qu'il est augmenté de 1, cela signifie que la taille du pointeur est augmentée en octets.

Je suppose que tu aimes

Origine blog.csdn.net/zp17834994071/article/details/108716755
conseillé
Classement