OVH Cloud OVH Cloud

tableau et pointeur : question très simple

21 réponses
Avatar
Lip
bonsoir,

dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.

Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...

Merci de bien vouloir me donner des explications simples et "décortiquées".
Lip


#include <stdio.h>
#include <stdlib.h>

int main(void) {

int tab[3] = {1,2,3};

/* les formes de l'adresse du tableau */
printf("Valeur de tab : %p\n", tab);
printf("Valeur de &tab[0] : %p\n", &tab[0]);
printf("Valeur de tab + 0 : %p\n", tab + 0);
printf("Valeur de &tab : %p\n", &tab);

printf("Valeur pointee : %d\n", **&tab); /* ICI */

printf("\n");

/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %d\n", tab[2]);
printf("Forme 2 : %d\n", *tab + 2);
printf("Forme 3 : %d\n", **&tab + 2); /* ICI */

printf("\n");

printf("Adresse du dernier element de tab : %p\n", &tab[2]);


return EXIT_SUCCESS;
}

1 réponse

1 2 3
Avatar
James Kanze
Emmanuel Delahaye writes:

|> Charlie Gordon wrote on 25/10/04 :
|> > La question a trouvé réponse, mais que dire de ces quelques lignes :

|> > #include <stdio.h>

|> > int main(void) {
|> > printf("main = %pn", (void*)(main));

|> Comportement indéfini.

Je croyais plutôt qu'il y fallait un diagnostique du compilateur.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
1 2 3