2010-10-01 4 views
2

Je n'arrive pas à comprendre la différence entre les différentes déclarations sur un tableau ou un tableau 2d.
par exemple:se référant à des tableaux comme des pointeurs

void swap(char **a, char **b) { 
    char *t = *a; 
    *a = *b; 
    *b = t; 
} 
int main(int argc, char **argv) { 
    char a[] = "asher"; 
    char b[] = "saban"; 
    swap(&a,&b); 
} 

ce code ne compile pas, il délivre en sortie:

warning: passing argument 1 of ‘swap’ from incompatible pointer type 
test.c:10: note: expected ‘char **’ but argument is of type ‘char (*)[6]’ 

n'est pas a un pointeur vers la première cellule de tableau de caractères et &a est un pointeur vers pointeur?

est un autre exemple:

char (*c)[3]; 
char (*d)[3]; 
swap(c,d); 

ne compile pas non plus .. est char (*c)[3] même comme un pointeur vers char a[] = "ab"?

Toutefois, cela ne compilez:

char *c[3]; 
char *d[3]; 
swap(c,d); 

donc je suis totalement confus. Pourquoi y a-t-il une différence? Y a-t-il des règles à ce sujet pour m'empêcher de me tromper tout le temps?

Merci à tous

+3

C'est la deuxième fois que nous avons vu ce code en trois jours: [Permutation de deux pointeurs de chaîne] (http://stackoverflow.com/questions/3816233/). Si, par hasard, c'est parce que vous partagez une classe avec la basse, vous voudrez peut-être vous réunir avec lui pour une aide mutuelle ... – dmckee

Répondre

9

Je pense que c'est la source de votre confusion.

Une variable de tableau est un objet fixe. Il fait référence à un ensemble fixe de membres de tableau. Il ne peut pas être modifié, bien que les valeurs des membres du groupe puissent le faire.

Dans tous les contextes d'expression autres que l'argument de l'unaire & (adresse de) et sizeof un tableau se désintègre en un pointeur vers son premier élément.

Étant donné:

char a[] = "asher"; 

L'expression a se désintègre à un pointeur vers un char (char*) et pointera vers le premier caractère de a. L'expression &a est un pointeur vers un tableau de char (char (*)[]). C'est un pointeur vers le tableau complet plutôt qu'un pointeur vers le premier caractère. C'est un type différent à un pointeur sur le premier caractère du tableau bien qu'il aura la même valeur qu'un pointeur vers le premier caractère du tableau.

Cependant, aucune des expressions a et &a sont lvalues ​​, ce sont des valeurs de pointeur temporaire.

Vous ne pouvez pas échanger de tableaux, vous ne pouvez échanger que des pointeurs, mais pour ce faire, vous avez besoin des pointeurs lvalue dont vous pouvez prendre l'adresse.

void swap(char **a, char **b); 

int main(int argc, char **argv) { 
    char a[] = "asher"; 
    char b[] = "saban"; 
    char* pa = a; 
    char* pb = b; 
    swap(&pa, &pb); 
} 
+0

Merci beaucoup, c'est une réponse très instructive –

Questions connexes