"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
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].
ou d'exception sur certains opérateur (& et sizeof,
et +, []...
Non, ces opérateurs attendent des valeurs. Et la somme d'un tableau et
d'un entier sera bien un pointeur, non ?
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é.
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
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).
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.
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
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].
ou d'exception sur certains opérateur (& et sizeof,
et +, []...
Non, ces opérateurs attendent des valeurs. Et la somme d'un tableau et
d'un entier sera bien un pointeur, non ?
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é.
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
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).
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.
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
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].
ou d'exception sur certains opérateur (& et sizeof,
et +, []...
Non, ces opérateurs attendent des valeurs. Et la somme d'un tableau et
d'un entier sera bien un pointeur, non ?
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é.
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
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).
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.
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
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].
ou d'exception sur certains opérateur (& et sizeof,
et +, []...
Non, ces opérateurs attendent des valeurs. Et la somme d'un tableau et
d'un entier sera bien un pointeur, non ?
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é.
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
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).
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.
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
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].
ou d'exception sur certains opérateur (& et sizeof,
et +, []...
Non, ces opérateurs attendent des valeurs. Et la somme d'un tableau et
d'un entier sera bien un pointeur, non ?
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é.
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
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).
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.
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
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].
ou d'exception sur certains opérateur (& et sizeof,
et +, []...
Non, ces opérateurs attendent des valeurs. Et la somme d'un tableau et
d'un entier sera bien un pointeur, non ?
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é.
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
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).
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.
"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 ?)
Je préfère
"La valeur d'un tableau est l'adresse et a le type de son premier élément".
"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 ?)
Je préfère
"La valeur d'un tableau est l'adresse et a le type de son premier élément".
"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 ?)
Je préfère
"La valeur d'un tableau est l'adresse et a le type de son premier élément".
En news:,
Yoxoman va escriure:On parle par exemple du nom du tableau
Un tableau est un objet. Parler de son "nom" est clairement un abus de
style. Un objet n'a pas vraiment de nom ; on peut concevoir de désigner de
cette façon l'identificateur qui _désigne_ l'objet, lorsqu'il est unique ;
mais parfois cet identificateur n'existe pas, ou il peut ne pas être unique.
En news:MPG.1e9489eee866b7c5989747@news.free.fr,
Yoxoman va escriure:
On parle par exemple du nom du tableau
Un tableau est un objet. Parler de son "nom" est clairement un abus de
style. Un objet n'a pas vraiment de nom ; on peut concevoir de désigner de
cette façon l'identificateur qui _désigne_ l'objet, lorsqu'il est unique ;
mais parfois cet identificateur n'existe pas, ou il peut ne pas être unique.
En news:,
Yoxoman va escriure:On parle par exemple du nom du tableau
Un tableau est un objet. Parler de son "nom" est clairement un abus de
style. Un objet n'a pas vraiment de nom ; on peut concevoir de désigner de
cette façon l'identificateur qui _désigne_ l'objet, lorsqu'il est unique ;
mais parfois cet identificateur n'existe pas, ou il peut ne pas être unique.
"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 ?)
Je préfère
"La valeur d'un tableau est l'adresse et a le type de son premier élément".
Pourquoi ? Un pointeur est un objet ?
En fait, je ne trouve pas de référence à ceci dans la norme. Pointeur
vers T est définit en tant que type, mais quand ils font référence à «
un pointeur », on ne sait pas vraiment précisément ce dont ils parlent.
Du coup, je considère « un pointeur » comme synonyme à « une expression
de type pointeur ».
"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 ?)
Je préfère
"La valeur d'un tableau est l'adresse et a le type de son premier élément".
Pourquoi ? Un pointeur est un objet ?
En fait, je ne trouve pas de référence à ceci dans la norme. Pointeur
vers T est définit en tant que type, mais quand ils font référence à «
un pointeur », on ne sait pas vraiment précisément ce dont ils parlent.
Du coup, je considère « un pointeur » comme synonyme à « une expression
de type pointeur ».
"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 ?)
Je préfère
"La valeur d'un tableau est l'adresse et a le type de son premier élément".
Pourquoi ? Un pointeur est un objet ?
En fait, je ne trouve pas de référence à ceci dans la norme. Pointeur
vers T est définit en tant que type, mais quand ils font référence à «
un pointeur », on ne sait pas vraiment précisément ce dont ils parlent.
Du coup, je considère « un pointeur » comme synonyme à « une expression
de type pointeur ».
"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
Emmanuel Delahaye wrote:"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
Mais &a n'est-il un pointeur ?
Le problème du fait que le même mot désigne à la fois un type, une
Emmanuel Delahaye wrote:
"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
Mais &a n'est-il un pointeur ?
Le problème du fait que le même mot désigne à la fois un type, une
Emmanuel Delahaye wrote:"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
Mais &a n'est-il un pointeur ?
Le problème du fait que le même mot désigne à la fois un type, une
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 ?
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 ?
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 ?
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
Heuh, je ne comprends rien à ta réponse. Dans les deux versions,
p pointe 'vers un tableau'.
Là, c'est moi qui ne comprend plus rien. Dans le premier cas, p pointe
vers un entier, non ? Tu as bien écrit "int* p", ou c'est mes yeux ? :)
Dans le premier cas, *p est de type
int, dans l'autre, il est de type int[4].
Oui, modulo 64. Ce que je dis, c'est que *p a une *valeur* (rvalue) 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 ?
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é.
Oui, mais je dois mal m'exprimer. L'exception d'opérateurs dont je
parle, c'est celle mentionnée dans la faq (via le lien que je t'ai
donné).
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
*p est de type array-to-T.
Ce dont je parlait ici, c'est des énoncés du type « Whenever we use the
name of an array as a value, that name represents a pointer to the
initial element of the array. » (Accelerated C++).
Ce qui me gène, c'est « name of an array », étant donné qu'il me semble
que cette règle s'applique également par exemple pour *p.
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.
Pour moi, pointeur est un type. Ou plutôt un ensemble de types (pointeur
vers T). Je considère « un pointeur » comme synonyme de « une
expression de type pointeur ». Et une rvalue est une expression...
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.
Ce singulier-pluriel (*la* valeur ; *ses* cases) peut-il avoir un sens ?
Ou alors la valeur de l'ensemble de ses cases ? Mais je ne sais pas ce
que c'est.
En cherchant dans la norme C, je trouve (§6.3.2.1/2) : « Except when it
is the operand of the sizeof operator, the unary & operator, the ++
operator, the -- operator, or the left operand of the . operator or an
assignment operator, an lvalue that does not have array type is
converted to the value stored in the designated object (and is no longer
an lvalue). (...) », et (§6.3.2.1/3) : « Except when it is the operand
of the sizeof operator or the unary & operator, or is a string literal
used to initialize an array, an expression that has type ??array of
type?? is converted to an expression with type ??pointer to type?? that
points to the initial element of the array object and is not an lvalue.
(...) ».
Le premier paragraphe parle de conversion vers une « valeur contenue »,
et le deuxième de conversion vers autre chose. On sent une similarité
entre ces deux paragraphes, notamment au niveau des operateurs qui sont
exclus (bien sûr, ++, --, et . ne peuvent s'appliquer à un tableau).
La norme C ne parle pas de rvalue. En note de bas de la page 46, on peut
lire : « What is sometimes called ??rvalue?? is in this International
Standard described as the ??value of an expression??. ».
On lit également (§3.17/1): « value : precise meaning of the contents of
an object when interpreted as having a specific type. ». Mais la norme
du C ne définit pas la « valeur » d'un tableau.
Pour la norme C :
- Pour les lvalue qui ne sont pas de type tableau, on a une « valeur
contenue », synonyme de « valeur ». Pour les lvalue de type tableau, on
a une autre conversion, et on s'abstient de parler de valeur.
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
Heuh, je ne comprends rien à ta réponse. Dans les deux versions,
p pointe 'vers un tableau'.
Là, c'est moi qui ne comprend plus rien. Dans le premier cas, p pointe
vers un entier, non ? Tu as bien écrit "int* p", ou c'est mes yeux ? :)
Dans le premier cas, *p est de type
int, dans l'autre, il est de type int[4].
Oui, modulo 64. Ce que je dis, c'est que *p a une *valeur* (rvalue) 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 ?
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é.
Oui, mais je dois mal m'exprimer. L'exception d'opérateurs dont je
parle, c'est celle mentionnée dans la faq (via le lien que je t'ai
donné).
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
*p est de type array-to-T.
Ce dont je parlait ici, c'est des énoncés du type « Whenever we use the
name of an array as a value, that name represents a pointer to the
initial element of the array. » (Accelerated C++).
Ce qui me gène, c'est « name of an array », étant donné qu'il me semble
que cette règle s'applique également par exemple pour *p.
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.
Pour moi, pointeur est un type. Ou plutôt un ensemble de types (pointeur
vers T). Je considère « un pointeur » comme synonyme de « une
expression de type pointeur ». Et une rvalue est une expression...
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.
Ce singulier-pluriel (*la* valeur ; *ses* cases) peut-il avoir un sens ?
Ou alors la valeur de l'ensemble de ses cases ? Mais je ne sais pas ce
que c'est.
En cherchant dans la norme C, je trouve (§6.3.2.1/2) : « Except when it
is the operand of the sizeof operator, the unary & operator, the ++
operator, the -- operator, or the left operand of the . operator or an
assignment operator, an lvalue that does not have array type is
converted to the value stored in the designated object (and is no longer
an lvalue). (...) », et (§6.3.2.1/3) : « Except when it is the operand
of the sizeof operator or the unary & operator, or is a string literal
used to initialize an array, an expression that has type ??array of
type?? is converted to an expression with type ??pointer to type?? that
points to the initial element of the array object and is not an lvalue.
(...) ».
Le premier paragraphe parle de conversion vers une « valeur contenue »,
et le deuxième de conversion vers autre chose. On sent une similarité
entre ces deux paragraphes, notamment au niveau des operateurs qui sont
exclus (bien sûr, ++, --, et . ne peuvent s'appliquer à un tableau).
La norme C ne parle pas de rvalue. En note de bas de la page 46, on peut
lire : « What is sometimes called ??rvalue?? is in this International
Standard described as the ??value of an expression??. ».
On lit également (§3.17/1): « value : precise meaning of the contents of
an object when interpreted as having a specific type. ». Mais la norme
du C ne définit pas la « valeur » d'un tableau.
Pour la norme C :
- Pour les lvalue qui ne sont pas de type tableau, on a une « valeur
contenue », synonyme de « valeur ». Pour les lvalue de type tableau, on
a une autre conversion, et on s'abstient de parler de valeur.
"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 ?)
Quelle conversion ? Et quel type de p ?
int tab[64];
int* p= tab;
ou bien
typedef int Tab64[64];
Tab64 tab;
Tab64 *p= &tab;
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.
Heuh, je ne comprends rien à ta réponse. Dans les deux versions,
p pointe 'vers un tableau'.
Là, c'est moi qui ne comprend plus rien. Dans le premier cas, p pointe
vers un entier, non ? Tu as bien écrit "int* p", ou c'est mes yeux ? :)
Dans le premier cas, *p est de type
int, dans l'autre, il est de type int[4].
Oui, modulo 64. Ce que je dis, c'est que *p a une *valeur* (rvalue) 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 ?
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é.
Oui, mais je dois mal m'exprimer. L'exception d'opérateurs dont je
parle, c'est celle mentionnée dans la faq (via le lien que je t'ai
donné).
http://www.eskimo.com/~scs/c-faq.com/aryptr/aryptrequiv.html
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'?
*p est de type array-to-T.
Ce dont je parlait ici, c'est des énoncés du type « Whenever we use the
name of an array as a value, that name represents a pointer to the
initial element of the array. » (Accelerated C++).
Ce qui me gène, c'est « name of an array », étant donné qu'il me semble
que cette règle s'applique également par exemple pour *p.
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.
Pour moi, pointeur est un type. Ou plutôt un ensemble de types (pointeur
vers T). Je considère « un pointeur » comme synonyme de « une
expression de type pointeur ». Et une rvalue est une expression...
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.
Ce singulier-pluriel (*la* valeur ; *ses* cases) peut-il avoir un sens ?
Ou alors la valeur de l'ensemble de ses cases ? Mais je ne sais pas ce
que c'est.
En cherchant dans la norme C, je trouve (§6.3.2.1/2) : « Except when it
is the operand of the sizeof operator, the unary & operator, the ++
operator, the -- operator, or the left operand of the . operator or an
assignment operator, an lvalue that does not have array type is
converted to the value stored in the designated object (and is no longer
an lvalue). (...) », et (§6.3.2.1/3) : « Except when it is the operand
of the sizeof operator or the unary & operator, or is a string literal
used to initialize an array, an expression that has type ??array of
type?? is converted to an expression with type ??pointer to type?? that
points to the initial element of the array object and is not an lvalue.
(...) ».
Le premier paragraphe parle de conversion vers une « valeur contenue »,
et le deuxième de conversion vers autre chose. On sent une similarité
entre ces deux paragraphes, notamment au niveau des operateurs qui sont
exclus (bien sûr, ++, --, et . ne peuvent s'appliquer à un tableau).
La norme C ne parle pas de rvalue. En note de bas de la page 46, on peut
lire : « What is sometimes called ??rvalue?? is in this International
Standard described as the ??value of an expression??. ».
On lit également (§3.17/1): « value : precise meaning of the contents of
an object when interpreted as having a specific type. ». Mais la norme
du C ne définit pas la « valeur » d'un tableau.
Pour la norme C :
- Pour les lvalue qui ne sont pas de type tableau, on a une « valeur
contenue », synonyme de « valeur ». Pour les lvalue de type tableau, on
a une autre conversion, et on s'abstient de parler de valeur.
Emmanuel Delahaye wrote:"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
Mais &a n'est-il un pointeur ?
Emmanuel Delahaye wrote:
"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
Mais &a n'est-il un pointeur ?
Emmanuel Delahaye wrote:"La valeur d'un tableau est l'adresse et a le type de son premier
élément".
Pourquoi ? Un pointeur est un objet ?
Oui, donc modifiable.
int a;
int *p = NULL;
p = &a;
Mais &a n'est-il un pointeur ?