2012-02-16 2 views
2

pouvez-vous me dire pourquoi la valeur d'un tableau référencé et la valeur du tableau lui-même a la même valeur?referenced array == array

je sais un est un type de int * mais avec & un il devrait être int ** ou ai-je tort ?? donc la valeur doit être un pointeur vers le pointeur int. exemple de code:

 
    #include &ltstdio.h> 

    int main() 
    { 
     int a[10]; 
     printf("a without ref.: 0x%x\n",a); 
     printf("a with ref.: 0x%x\n",&a); 
     return 0; 
    } 

http://ideone.com/KClQJ

+1

duplication possible de [C: Comment l'adresse d'un tableau est-elle égale à sa valeur?] (Http://stackoverflow.com/questions/2528318/c-how-come-an-arrays-address-is-equal- à sa valeur) – jpalecek

+0

Voir aussi: http://stackoverflow.com/q/7351331/51831 – jpalecek

+0

Vous pourriez aimer [une réponse à la mienne à une question similaire] (http://stackoverflow.com/questions/5181237/ confusion-in-data-types-in-a-2d-array/5181495 # 5181495) demandé il y a quelque temps. – pmg

Répondre

4

Nom du tableau désintègre à un pointeur sur son premier élément dans ce cas.

+0

Je ne pense pas que ce soit le * nom * qui se désintègre.Le tableau lui-même se désintègre :) +1 de toute façon –

0

s'il y a int * p où le point A, puis,

a + 0 == & a [0] == == 0 p + & p [0]: adresse

* (a + 0) == * (& a [0]) == * (p + 0) == * (& p [0]):

données

a == == & & une a [0]

+0

Les ** types ** de 'a' et' & a' ne sont pas les mêmes (bien que les valeurs le soient): on ne peut pas dire que 42 carottes sont les mêmes que 42 pommes de terre. – pmg

1

Le nom du tableau sera converti implicitement en un pointeur, sauf Pour deux situations, l'une est "& array", l'autre est "sizeof (array)" Dans les deux cas, le nom du tableau est un tableau, pas un pointeur.

Par exemple:.

int a[10]; 
int *p; 
p = a;  //a is a pointer 
p = &a;  //a is a array,&a is a constant pointer 
sizeof(a); //a is array 
1

Compte tenu d'une déclaration de tableau T a[N], l'expression &a a le type « pointeur sur un tableau de N-élément de T (T (*)[N]) et sa valeur est l'adresse de base de la matrice A cet le respect, l'opérateur & unaire se comporte de la même pour les tableaux comme pour tout autre type de données.

ce qui est hinky comment C traite l'expression du tableau a. Sauf quand il est l'opérande du sizeof ou un opérateur littéral &, ou est une chaîne littérale utilisée pour initialiser un autre tableau dans une déclaration, une expression de type "N-élément tableau de T" (T [N]) sera remplacée par ("decay to") une expression de pointeur de tapez "pointeur vers T" (T *) et sa valeur sera l'adresse du premier élément du tableau. IOW, a == &a[0].

Puisque l'adresse du premier élément du tableau est la même que l'adresse de base de l'ensemble du réseau, les expressions a et &a donnent le même valeur, mais les types sont différents (T * par opposition à T (*)[N]) .