OVH Cloud OVH Cloud

De la pertinence d'une phrase

67 réponses
Avatar
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)

10 réponses

1 2 3 4 5
Avatar
Pierre Maurette
"Pierre Maurette" a écrit dans le message de
news:

Question aux gurus: il me semble évident qu'à partir du moment où une
variable est déclarée, et durant toute sa vie, l'opérateur adresse
renverra toujours la même valeur. Vous confirmez ?


Oh, c'est étonnant comme question.
J'essaye d'imaginer qu'il en soit ainsi, l'opérateur adresse retournant pour
un même variable une valeur différente ... Je ne le conçoit pas. Ou alors,
en revenant à la segmentation de la mémoire.
Je ne le concevais pas non plus. Et en réfléchissant un peu plus, je le

conçois encore moins. Pourquoi ? parce que le résultat de l'opérateur
adresse déréférencé donne la variable. Mais effectivement, en mode
segmenté "à la Intel", deux adresses différentes numériquement peuvent
pointer vers la même cas mémoire.

Une remarque: le fait de prendre l'adresse d'une variable peut changer
son statut par rapport à l'optimisation, c'est à dire forcer le
compilateur à la créer physiquement.

--
Pierre Maurette


Avatar
Emmanuel Delahaye
int a;
int *p = NULL;

p = &a;


Mais &a n'est-il un pointeur ?


&a est-il modifiable ? Non. C'est donc une adresse, pas un pointeur.

--
A+

Emmanuel Delahaye


Avatar
Emmanuel Delahaye
Le problème du fait que le même mot désigne à la fois un type, une
variable, une valeur (constante ou modifiable) n'en est pas un, puisque
c'est comme ça.

&a est une rvalue de type int*. Sa valeur n'est pas connue à la
compilation, mais je pense qu'on a le droit de la considérer comme une
valeur immédiate. En fait, dans ce cas où a est une variable
automatique, et s'il y a une pile, &a sera remplacé par une valeur
immédiate ajoutée ou retranchée au pointeur de pile.
J'imagine qu'en C, comme c'est courant en assembleur, &a, selon la
classe de stockage de a, peut-être une valeur immédiate résolue par le
loader.


On a pas besoin de ce verbiage pour dire que l'adresse d'un objet est
une expression constante, et ce, quelle que soit l'architecture qui n'a
strictement aucun rapport avec le sujet.

Question aux gurus: il me semble évident qu'à partir du moment où une
variable est déclarée, et durant toute sa vie, l'opérateur adresse


définie...

renverra toujours la même valeur. Vous confirmez ?


Oui.

--
A+

Emmanuel Delahaye

Avatar
Emmanuel Delahaye
"Pierre Maurette" a écrit dans le message de news:

Question aux gurus: il me semble évident qu'à partir du moment où une
variable est déclarée, et durant toute sa vie, l'opérateur adresse
renverra toujours la même valeur. Vous confirmez ?


J'essaye d'imaginer qu'il en soit ainsi, l'opérateur adresse retournant pour un même variable une valeur différente ... Je ne le conçoit pas.
Ou alors, en revenant à la segmentation de la mémoire.


Aucun rapport.

--
A+

Emmanuel Delahaye


Avatar
Emmanuel Delahaye
Je ne le concevais pas non plus. Et en réfléchissant un peu plus, je le
conçois encore moins. Pourquoi ? parce que le résultat de l'opérateur
adresse déréférencé donne la variable.


La valeur de la variable... Le variable, c'est le nom donné à
l'emplacement mémoire.

Mais effectivement, en mode
segmenté "à la Intel", deux adresses différentes numériquement peuvent
pointer vers la même cas mémoire.


Aucun rapport.

Une remarque: le fait de prendre l'adresse d'une variable peut changer
son statut par rapport à l'optimisation, c'est à dire forcer le
compilateur à la créer physiquement.


En C, il n'est jamais question d'adresse 'physique'. Une adresse est une
valeur numérique qui permet de distinguer un objet d'un autre dans un
contexte donné.

--
A+

Emmanuel Delahaye

Avatar
bruno at modulix
Emmanuel Delahaye wrote:

int a;
int *p = NULL;

p = &a;



Mais &a n'est-il un pointeur ?


&a est-il modifiable ? Non. C'est donc une adresse, pas un pointeur.


<complement>
... laquelle adresse est une *valeur* valide pour une variable de type
pointeur sur int.
</complement>


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



Avatar
Emmanuel Delahaye
1 est il un int ?


On ne peut pas comparer un type et une valeur.

1 est une expression constante de type int.
1u est une expression constante de type unsigned int.
1l est une expression constante de type long.
1ul est une expression constante de type unsigned long.
1f est une expression constante de type float.
1.0 est une expression constante de type double.
etc.

--
A+

Emmanuel Delahaye

Avatar
Marc Boyer
Le 31-03-2006, Emmanuel Delahaye a écrit :
1 est il un int ?


On ne peut pas comparer un type et une valeur.


C'était bien le sens de ma remarque.

1 est une expression constante de type int.


Et surtout, ça n'est pas un objet, ni une variable donc.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)


Avatar
Pierre Maurette
[...]
On a pas besoin de ce verbiage pour dire que l'adresse d'un objet est une
expression constante, et ce, quelle que soit l'architecture qui n'a
strictement aucun rapport avec le sujet.
Je trouvais amusant de voir parfois convertir une affectation p = &a en

une affectation de valeur immédiate. Et je ne suis pas le seul à avoir
tiqué face à cette étrangeté apparente. Mais le verbeux s'amusera sans
toi...

Question aux gurus: il me semble évident qu'à partir du moment où une
variable est déclarée, et durant toute sa vie, l'opérateur adresse


définie...

renverra toujours la même valeur. Vous confirmez ?


Oui.
J'avais précisé "aux gurus" ...


--
Pierre Maurette


Avatar
Emmanuel Delahaye
1 est il un int ?
On ne peut pas comparer un type et une valeur.



C'était bien le sens de ma remarque.

1 est une expression constante de type int.


Et surtout, ça n'est pas un objet, ni une variable donc.


'expression constante', ça ne te suffit pas ?

--
A+

Emmanuel Delahaye



1 2 3 4 5