De la pertinence d'une phrase
Le
Yoxoman
"La valeur d'un tableau est un pointeur vers son premier élément".
(valeur dans le sens rvalue. D'ailleurs ce mot peut-il avoir un autre
sens ?)
On entend souvent des formulations plus ou moins diverses et compliquées
sur cette conversion tableau-pointeur, ce qui fait qu'on a du mal à s'y
retrouver.
On parle par exemple du nom du tableau (alors que si p pointe vers un
tableau, il me semble que *p est également concerné par cette
conversion), ou d'exception sur certains opérateur (& et sizeof, ce qui
n'est pas faux, mais dont la cause semble être le fait que derrière ces
opérateurs, une lvalue n'est pas convertie en rvalue).
Ma question est simple : cette phrase est-elle vraie ?
--
"Yo!"
Martin Heidegger (trad. Terrence Malick)
(valeur dans le sens rvalue. D'ailleurs ce mot peut-il avoir un autre
sens ?)
On entend souvent des formulations plus ou moins diverses et compliquées
sur cette conversion tableau-pointeur, ce qui fait qu'on a du mal à s'y
retrouver.
On parle par exemple du nom du tableau (alors que si p pointe vers un
tableau, il me semble que *p est également concerné par cette
conversion), ou d'exception sur certains opérateur (& et sizeof, ce qui
n'est pas faux, mais dont la cause semble être le fait que derrière ces
opérateurs, une lvalue n'est pas convertie en rvalue).
Ma question est simple : cette phrase est-elle vraie ?
--
"Yo!"
Martin Heidegger (trad. Terrence Malick)

Poser une question

<disclaimer val="pas fait de C depuis lulure, corriger si besoin" />
Bon, reprenons...
Un tableau V de N éléments de type T est, techniquement, un block de
mémoire contigu d'une taille suffisante pour stocker N élément de type T
(problèmes d'alignement etc compris...). Le fait de connaitre T permet
de connaitre la taille de T, donc de pouvoir, à partir de l'adresse de
V[0], calculer l'adresse de V[x].
Accessoirement, l'adresse de V[0] étant celle du premier élément du
tableau, elle est aussi celle du block mémoire lui-même puisque c'est à
cette adresse qu'il commence (M. de la Palisse vous salue bien). Et la
*valeur* de V (pas son *adresse*) est bien *l'adresse* de V[0] - sans
quoi on ne pourrrait pas accéder à ce block mémoire.
On est en fait dans la même situation qu'avec un pointeur sur block de
mémoire de taille T*N dynamiquement alloué - à un détail près: le type
tableau connait sa 'taille' (ie le nombre d'éléments) alors que le type
pointeur ne connait pas la taille du bloc mémoire sur lequel il pointe.
Et on peut effectivement, *dans les deux cas*, utiliser de façon
interchangeable la syntaxe tableau et la syntaxe pointeur - puisqu'en
fait la syntaxe tableau n'est guère plus que du sucre syntaxique.
Qui n'est rien d'autre qu'un symbole...
définition de p ???
Quelle conversion ?-)
La seule conversion (implicite, j'entend) est celle qui a lieu quand tu
passe un tableau en paramètre à une fonction. Ce que la fonction reçoit
effectivement est un pointeur, et non le tableau lui-même - d'où le fait
que sizeof retourne la taille du pointeur et non le nombre d'éléments du
tableau.
Laquelle ?-)
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"
C'est que les formulation justes sont souvent compliquées, et
les simples sont pas complètement justes.
Bon, il existe aussi des compliquées fausses....
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
et +, []...
Là, je suis perdu.
Pas dans un contexte de logique booléenne. Après,
si on acepte d'avoir une valeur de véracité continue
entre 0 et 1, je lui mets environ 0,8...
Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)
Oui.
Oui.
Oui.
Je pense aussi. Mais il me semble que c'est en contradiction avec la fin
de
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptr2.html
Et quelle est la définition de symbole ? Si *p (ci-dessous) en est un,
ce n'est pas le nom d'un tableau. Ne faut-il pas dire "identifiant" ?
du type :
int a[3] = {0, 1, 2};
int (*p)[3] = &a;
En effet, pas de conversion, sinon celle de lvalue à rvalue.
Oui.
Celle du début... :)
--
"Yo!"
Martin Heidegger (trad. Terrence Malick)
Bah, p pointe vers un tableau. C'est la deuxième solution, il me semble.
Mais comme me l'a fait remarquer Bruno, il n'y a pas de conversion.
C'est juste que *p a une valeur de type pointeur vers int.
Non, ces opérateurs attendent des valeurs. Et la somme d'un tableau et
d'un entier sera bien un pointeur, non ? En fait, je parle des énoncés
tel que ceux de la faq :
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
Il me semble que & et sizeof s'appliquent à des lvalue (semantiquement
un objet - avec une adresse), alors que (tous ?) les autres opérateurs
s'appliquent à des rvalue (sémantiquement une valeur).
Ha bon ? Mais pourquoi ? Je parle de la phrase du début (je ne sais pas
si je suis clair).
--
"Yo!"
Martin Heidegger (trad. Terrence Malick)
Heuh, je ne comprends rien à ta réponse. Dans les deux versions,
p pointe 'vers un tableau'. Dans le premier cas, *p est de type
int, dans l'autre, il est de type int[4].
Oui, mais le calcul effectué par + dépend de type de pointeur.
Si tu veux, p+1 sera différent dans les deux versions que j'ai donné.
Ben, il a l'air plutôt juste comme énoncé. Mais il parle
bien de 'array-to-T' et 'pointer-to-T', et pas (comme ma deuxième
version) 'pointer-to-array-to-T'?
Et sizeof(int) ?
Ben
"La valeur d'un tableau est un pointeur vers son premier élément".
n'a pas de sens car 'valeur' en a peu, et 'pointeur' est un objet,
pas une valeur.
On pourrait avancer vers:
"La valeur d'un tableau sur T est égale à celle d'un pointeur
du T contenant l'adresse de son premier élement".
Mais je ne suis toujours pas d'accord, car la valeur d'un
tableau, c'est pour moi la valeur de ces cases.
Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)