2017-10-17 13 views
0

Je ne comprends pas comment C stocke en mémoire un tableau. Dans l'exemple ci-dessous, l'adresse de str1 est égale à sa valeur. Whit ce que j'interprétais le résultat comme: l'adresse mémoire & str1 contient la valeur de l'adresse elle-même. Mais cela ne peut pas être le cas parce que d'autres exemples j'ai vu l'adresse de str1 contient la première valeur de la chaîne, qui dans ce cas est "H". Donc, ma question peut être: où est stockée l'adresse de str1?Emplacement de la mémoire C du nom de la baie

#include <stdio.h> 

int main(int argc, char const *argv[]) { 
    char str1[] = "Hello World"; 
    printf("%d %d %c\n",&str1,str1,str1[0]); 
    return 0; 
} 
+0

Quand vous dites "adresse de' str1' ", que voulez-vous dire exactement par là? –

+0

'str1' est un tableau donc l'utilisation de ce nom comme vous le faites ici a pour résultat son adresse. '& str1' évalue à la même valeur que' str1'. 'str1 [0]' est la valeur de son premier élément. –

+0

@PaulOgilvie '& str1' et' str1' évaluent à la même valeur mais différents types. –

Répondre

1

Tout d'abord, vous devez utiliser %p spécificateur de format pour imprimer une adresse (pointeur).

Cela dit, citant C11, chapitre §6.3.2.1

Sauf quand il est l'opérande de l'opérateur sizeof, l'opérateur _Alignof ou le unaire opérateur &, ou est une chaîne de caractères utilisée pour initialiser un tableau, une expression de type '' tableau de type '' est convertie en une expression de type '' pointer vers type '' qui pointe vers l'élément initial de l'objet tableau et n'est pas une valeur lvalue.

Donc, en gros,

printf("%p", str1); 
    printf("%p", &str1[0]); 

sont les mêmes.

Maintenant, venant à la partie de &str1, eh bien, le type est différent. Il est de type char [<array size>].