Différence : le tableau de pointeurs lui-même est un tableau, et les éléments du tableau sont des pointeurs, c'est-à-dire que le tableau stocke les pointeurs. Le nombre d'octets occupés par le tableau est déterminé par le tableau lui-même et le pointeur du tableau ; lui-même est un pointeur qui pointe vers un tableau, c'est-à-dire qu'il s'agit d'un pointeur vers un tableau qui occupe toujours 4 octets dans un système 32 bits.
L'environnement d'exploitation de ce tutoriel : Système Windows7, version c99, ordinateur Dell G3.
Je pense que de nombreux programmeurs C seront confus quant aux concepts de tableaux de pointeurs et de pointeurs de tableau. Analysons la différence entre les deux à travers deux instructions simples. L'exemple de code est le suivant :
int *p1[5]; int (*p2)[5];
Tout d'abord, pour l'instruction "int*p1[5]", en raison de la priorité de "[]" est supérieur à "*", donc p1 est d'abord combiné avec "[]" pour former la définition d'un tableau. Le tableau est nommé p1 et "int*" modifie le contenu du tableau, c'est-à-dire chaque élément du tableau. tableau. Autrement dit, le tableau contient 5 pointeurs vers des données de type int, comme le montre la figure 1. Il s'agit donc d'un tableau de pointeurs.
Deuxièmement, pour l'instruction "int(*p2)[5]", "()" a une priorité plus élevée que "[]", et le " Le signe *" et p2 forment la définition d'un pointeur. La variable pointeur est nommée p2 et int modifie le contenu du tableau, c'est-à-dire chaque élément du tableau. Autrement dit, p2 est un pointeur qui pointe vers un tableau contenant 5 données de type int, comme le montre la figure 2. Évidemment, il s'agit d'un pointeur de tableau. Le tableau n'a pas de nom ici et est un tableau anonyme.
On voit que pour un tableau de pointeurs, tout d'abord, c'est un tableau, et les éléments du tableau sont tous des pointeurs, ce qui veut dire que le le tableau stocke les pointeurs. Le nombre d'octets qu'un tableau occupe est déterminé par le tableau lui-même ; et pour un pointeur de tableau, c'est avant tout un pointeur qui pointe vers un tableau, c'est-à-dire un pointeur vers un tableau. , qui occupe toujours 4 octets dans un système 32 bits. Quant au nombre d'octets occupés par le tableau vers lequel il pointe, cela ne peut pas être déterminé et dépend de la situation spécifique.
Après avoir compris la différence entre les tableaux de pointeurs et les pointeurs de tableau, continuez à regarder l'exemple de code suivant :
int arr[5]={1,2,3,4,5}; int (*p1)[5] = &arr; /*下面是错误的*/ int (*p2)[5] = arr;
Il n'est pas difficile de voir que dans l'exemple de code ci-dessus, &arr fait référence à l'ensemble du tableau. La première adresse et arr sont la première adresse du premier élément du tableau d'index. Bien qu'elles aient des significations différentes, les valeurs entre les deux sont les mêmes. Alors la question se pose puisque les valeurs sont les mêmes, pourquoi l'instruction "int(*p1)[5]=&arr" est-elle correcte, mais l'instruction "int(*p2)[5]=arr" s'exécute sous certains. compilateurs ? Un message d’erreur apparaîtra.
En fait, la raison est très simple. En langage C, les types de données des deux côtés du symbole d'affectation "=" doivent être les mêmes. S'ils sont différents, une conversion de type explicite ou implicite est requise. Ici, p1 et p2 sont tous deux des pointeurs de tableau, pointant vers l’ensemble du tableau. Les types de données des deux côtés du signe "=" dans la définition de p1 sont complètement cohérents, mais les types de données des deux côtés du signe "=" dans la définition de p2 sont incohérents (le type de gauche est un pointeur vers l'ensemble du tableau, tandis que le type de données à droite est un pointeur vers un pointeur de caractère unique), un message d'erreur s'affichera donc.
Recommandations associées : "Tutoriel vidéo sur le langage C"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!