personnes.
J'essaie de saisir les différences entre ces trois déclarations: p> J'essaie de le découvrir en faisant des tests, car Chaque guide des déclarations de lecture et des trucs comme ça ne m'a pas aidé jusqu'à présent. J'ai écrit ce petit programme et cela ne fonctionne pas (j'ai essayé d'autres types d'utilisation de la troisième déclaration et j'ai manqué d'options): P> #include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char p1[5];
char *p2[5];
char (*p3)[5];
strcpy(p1, "dead");
p2[0] = (char *) malloc(5 * sizeof(char));
strcpy(p2[0], "beef");
p3[0] = (char *) malloc(5 * sizeof(char));
strcpy(p3[0], "char");
printf("p1 = %s\np2[0] = %s\np3[0] = %s\n", p1, p2[0], p3[0]);
return 0;
}
4 Réponses :
Le troisième est un bouton em> à un tableau de 5 caractères, alors que le second est un tableau de 5 pointeurs à char. Imaginez-le comme ceci: < / p> alors que le second ressemble à celui: p> C'est l'un des cas où la différence entre les pointeurs et Les tableaux sont cruciaux. Un tableau est un objet dont la taille est la taille de chacun de ses éléments fois le compte, alors qu'un pointeur est simplement une adresse. P> dans le deuxième cas, dans le troisième cas, taille de (p) code> donnera
5 * the_size_of_a__pointer code>. p>
Tailleof (p) code> donnera
the_size_of_a_pointer code>, qui est généralement
4 code> ou
8 code>, en fonction de la machine cible. p> p>
règle spirale d'une montre est une chose pratique à savoir quand vous jouez avec c code>.
J'ai essayé d'utiliser P3 allouant 5 caractères et pointant P3 à ceux et cela n'a pas fonctionné. Cela ne fonctionne pas comme vous l'avez dit ... Voulez-vous afficher un exemple de code ou quelque chose de plus clair?
Dans le troisième cas, Tailleof (P3) ne cède pas ce que vous avez dit, cela cède 8, qui est la taille d'un pointeur dans ma machine.
@JPMELOS: Le troisième ne fonctionne pas car p3 code> est un pointeur UNIALIALISÉ et que vous essayez de la désirer avec l'opérateur de l'indice de réseau (
P3 [0] code>). Vous pouvez faire quelque chose comme ça:
p3 = & p1 code>.
@jpmelos: Oups, oui, une erreur de frappe.
Merci. Mais j'ai posté une réponse à moi après que je l'ai compris, ce que je pense est beaucoup plus clair.
C'est un pointeur à un tableau de caractères. Il est expliqué dans le C FAQ . À l'avenir, lorsque vous ne comprenez pas une déclaration, utilisez CDECL code>
ou < Code> CDECL (1) code>. P>
Merci beaucoup, votre lien avec la FAQ C a aidé à comprendre considérablement ce sujet.
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char p1[5]; char *p2[5]; char (*p3)[5]; strcpy(p1, "dead"); p2[0] = (char *) malloc(5 * sizeof(char)); strcpy(p2[0], "beef"); p3 = &p1; printf("p1 = %s\np2[0] = %s\np3 = %s\n", p1, p2[0], *p3); return 0; }
Génial, vous avez résumé ma réponse meilleure :-)
int x[10][20]; foo(x); ... void foo(int (*px)[20]){...}
+1. Très bonne explication! Merci, a vraiment précisé comment penser des déclarations!
Dans votre édition, le premier contexte, vous dites x code> a type
int * code> et
& x code> a type
int (*) [10] / code>. Vous voulez dire
x code> de type
int [10] code>, je suppose?
@JPMELOS: Comme il n'est pas un opérande de Tailleof code> ou
& code>,
x code> serait décomposer à
int * code>.
Les déclarations de décodage sont ma partie préférée de C et C ++.