9
votes

Quelle est la signification de 'Char (* p) [5];'?

personnes.

J'essaie de saisir les différences entre ces trois déclarations: p> xxx pré>

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;                                                               
}


1 commentaires

Les déclarations de décodage sont ma partie préférée de C et C ++.


4 Réponses :


13
votes

Le troisième est un bouton à un tableau de 5 caractères, alors que le second est un tableau de 5 pointeurs à char.

Imaginez-le comme ceci: < / p> xxx

alors que le second ressemble à celui: xxx

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.

dans le deuxième cas, taille de (p) donnera 5 * the_size_of_a__pointer .

dans le troisième cas, Tailleof (p) donnera the_size_of_a_pointer , qui est généralement 4 ou 8 , en fonction de la machine cible.


6 commentaires

règle spirale d'une montre est une chose pratique à savoir quand vous jouez avec c .


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 est un pointeur UNIALIALISÉ et que vous essayez de la désirer avec l'opérateur de l'indice de réseau ( P3 [0] ). Vous pouvez faire quelque chose comme ça: p3 = & p1 .


@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.



4
votes

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 ou < Code> CDECL (1) .


1 commentaires

Merci beaucoup, votre lien avec la FAQ C a aidé à comprendre considérablement ce sujet.



3
votes
#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;                                                               
}

1 commentaires

Génial, vous avez résumé ma réponse meilleure :-)



4
votes
int x[10][20];
foo(x);
...
void foo(int (*px)[20]){...}

3 commentaires

+1. Très bonne explication! Merci, a vraiment précisé comment penser des déclarations!


Dans votre édition, le premier contexte, vous dites x a type int * et & x a type int (*) [10] / code>. Vous voulez dire x de type int [10] , je suppose?


@JPMELOS: Comme il n'est pas un opérande de Tailleof ou & , x serait décomposer à int * .