Question

Dans les règles suivantes pour le cas où tableau désintègre à pointeur:

  

Une lvalue [voir question 2.5] du tableau de type-of-T qui apparaît dans une expression décroît (avec trois exceptions) en un pointeur vers le premier élément; le type de pointeur est obtenu pointeur à T.

     

(Les exceptions sont lorsque le tableau est l'opérande d'un sizeof ou d'opérateur, ou est un initialiseur de chaîne littérale pour un tableau de caractères.)

Comment comprendre le cas lorsque le tableau est « initialiseur de chaîne littérale pour un tableau de caractères »? Quelques exemples s'il vous plaît.

Merci!

Était-ce utile?

La solution

Les trois exceptions où un tableau ne se dégrade pas en un pointeur sont les suivantes:

Exception 1 -.. Lorsque le réseau est l'opérande de sizeof

int main()
{
   int a[10];
   printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */

   int* p = a;
   printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}

Exception 2 -.. Lorsque le tableau est l'opérande de l'opérateur &

int main()
{
    int a[10];
    printf("%p", (void*)(&a)); /* prints the array's address */

    int* p = a;
    printf("%p", (void*)(&p)); /*prints the pointer's address */
}

Exception 3 -.. Lorsque le tableau est initialisé avec une chaîne de caractères

int main()
{
    char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */

    char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}

Autres conseils

Supposons que les déclarations

char foo[] = "This is a test";
char *bar  = "This is a test";

Dans les deux cas, le type de littéral chaîne « This is a test » est « tableau 15 éléments de char ». Dans la plupart des cas, les expressions du tableau sont convertis implicitement à partir du type « tableau N-élément de T » à « pointeur sur T », et l'expression renvoie à l'adresse du premier élément du tableau. Dans la déclaration de bar, c'est exactement ce qui se passe.

Dans la déclaration de foo, cependant, l'expression est utilisée pour initialiser le contenu d'un autre tableau, et est donc pas converti en un type de pointeur; à la place, les contenu de la chaîne littérale sont copiés foo.

Ceci est un initialiseur de chaîne littérale pour un tableau de caractères:

char arr[] = "literal string initializer";

Peut-être aussi:

char* str = "literal string initializer";

Définition de K & R2:

  

Une chaîne, appelée aussi une chaîne   constant, est une séquence de caractères   entouré par des guillemets doubles comme dans   "...". Une chaîne est de type `` réseau de   personnages »et la classe de stockage statique   (Voir Par.A.3 ci-dessous) et est initialisé   avec les caractères donnés. Qu'il s'agisse   littéraux de chaîne identiques sont distincts   est, et la mise en œuvre défini   comportement d'un programme qui tente de   modifier une chaîne de caractères est définie.

Il semble que vous avez tiré cette citation de la FAQ comp.lang.c (peut-être une ancienne version ou peut-être la version imprimée, il ne correspond pas tout à fait avec l'état actuel de celui en ligne):

http://c-faq.com/aryptr/aryptrequiv.html

Les liens de la section correspondant à d'autres sections de la FAQ d'élaborer sur ces exceptions. Dans votre cas, vous devriez regarder:

http://c-faq.com/decl/strlitinit.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top