Le 05-05-2011, Pascal J. Bourguignon a écrit :
Oui, mais ça n'a pas changé l'adresse de str. Lis mes programmes!
L'adresse de str n'a pas changée, mais la valeur stockée, elle, à changée
et pointe vers autre chose si j'ai bien compris?
Le 05-05-2011, Pascal J. Bourguignon <pjb@informatimago.com> a écrit :
Oui, mais ça n'a pas changé l'adresse de str. Lis mes programmes!
L'adresse de str n'a pas changée, mais la valeur stockée, elle, à changée
et pointe vers autre chose si j'ai bien compris?
Le 05-05-2011, Pascal J. Bourguignon a écrit :
Oui, mais ça n'a pas changé l'adresse de str. Lis mes programmes!
L'adresse de str n'a pas changée, mais la valeur stockée, elle, à changée
et pointe vers autre chose si j'ai bien compris?
On 05/05/2011 04:19 PM, Marc Espie wrote:In article<4dc2849b$0$27967$,
Alexandre Bacquart wrote:Dans :
char *str = "abcdefgh";
Il y a deux choses : la chaîne "abcdefgh" (que tu ne peux pas modifier)
et le pointeur str (initialisé sur cette chaîne). Alors que dans :
char tab[] = "abcdefgh";
Il n'y a que la chaîne (toujours pas modifiable) *identifiée* par s.
Aucun pointeur. Ici, tab n'est pas un pointeur, mais identifie la
chaîne.
Dans ce code, au moment de l'execution, il n'y a pas de chaine
"abcdefgh".
Il faut bien qu'elle soit quelque-part.
mais en général, la chaîne est bel et bien dans le seg[...]
le sucre syntaxique, c'est super, mais ça contribue à cacher des
mécanismes qui autrement apparaîtraient plus nettement aux débutants.
Quand tu utilises tab ailleurs dans le programme, il se passe
quelque-chose d'assez subtil : un pointeur temporaire est créé pour que
tab se comporte comme un pointeur, comme dans :
Non. Rien n'est cree. Un tableau, dans un contexte qui a besoin d'un
pointeur, est considere exactement comme un pointeur, constant de sucroit.
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse,
On 05/05/2011 04:19 PM, Marc Espie wrote:
In article<4dc2849b$0$27967$426a34cc@news.free.fr>,
Alexandre Bacquart<tek512@free.DELETEME.fr> wrote:
Dans :
char *str = "abcdefgh";
Il y a deux choses : la chaîne "abcdefgh" (que tu ne peux pas modifier)
et le pointeur str (initialisé sur cette chaîne). Alors que dans :
char tab[] = "abcdefgh";
Il n'y a que la chaîne (toujours pas modifiable) *identifiée* par s.
Aucun pointeur. Ici, tab n'est pas un pointeur, mais identifie la
chaîne.
Dans ce code, au moment de l'execution, il n'y a pas de chaine
"abcdefgh".
Il faut bien qu'elle soit quelque-part.
mais en général, la chaîne est bel et bien dans le seg[...]
le sucre syntaxique, c'est super, mais ça contribue à cacher des
mécanismes qui autrement apparaîtraient plus nettement aux débutants.
Quand tu utilises tab ailleurs dans le programme, il se passe
quelque-chose d'assez subtil : un pointeur temporaire est créé pour que
tab se comporte comme un pointeur, comme dans :
Non. Rien n'est cree. Un tableau, dans un contexte qui a besoin d'un
pointeur, est considere exactement comme un pointeur, constant de sucroit.
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse,
On 05/05/2011 04:19 PM, Marc Espie wrote:In article<4dc2849b$0$27967$,
Alexandre Bacquart wrote:Dans :
char *str = "abcdefgh";
Il y a deux choses : la chaîne "abcdefgh" (que tu ne peux pas modifier)
et le pointeur str (initialisé sur cette chaîne). Alors que dans :
char tab[] = "abcdefgh";
Il n'y a que la chaîne (toujours pas modifiable) *identifiée* par s.
Aucun pointeur. Ici, tab n'est pas un pointeur, mais identifie la
chaîne.
Dans ce code, au moment de l'execution, il n'y a pas de chaine
"abcdefgh".
Il faut bien qu'elle soit quelque-part.
mais en général, la chaîne est bel et bien dans le seg[...]
le sucre syntaxique, c'est super, mais ça contribue à cacher des
mécanismes qui autrement apparaîtraient plus nettement aux débutants.
Quand tu utilises tab ailleurs dans le programme, il se passe
quelque-chose d'assez subtil : un pointeur temporaire est créé pour que
tab se comporte comme un pointeur, comme dans :
Non. Rien n'est cree. Un tableau, dans un contexte qui a besoin d'un
pointeur, est considere exactement comme un pointeur, constant de sucroit.
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse,
Ta vision des choses est legerement differente de la realite.
Je ne crois pas.Dans ce code, au moment de l'execution, il n'y a pas de chaine "abcdefgh".
Il faut bien qu'elle soit quelque-part. Insinuerais-tu que c'est une
chaîne procédurale ? :) Je ne sais pas d'ailleurs si la norme autorise
implicitement ce genre de pratique, mais en général, la chaîne est bel
et bien dans le segment de données à l'exécution. Dire qu'il n'y a pas
de chaîne me semble confus, au contraire.
La chaine n'a qu'une existence pendant la compilation, c'est un initialiseur
pour un tableau. Le code ecrit est strictement equivalent a:
char tab[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 0 };
ce que tu as la, c'est juste du sucre syntaxique:
Oui. Quitte à chipoter (et être plus clair), j'aurais plutôt écris ' '
à la fin, mais oui... le sucre syntaxique, c'est super, mais ça
contribue à cacher des mécanismes qui autrement apparaîtraient plus
nettement aux débutants.
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse, l'équivalent en assembleur d'un pointeur. Quand je dis
"temporaire", je ne suppose pas qu'un emplacement mémoire temporaire est
créé à son intention (encore que le compilateur fait bien ce qu'il
veut). Mais cela me semble plus simple de l'expliquer comme cela.
Ta vision des choses est legerement differente de la realite.
Je ne crois pas.
Dans ce code, au moment de l'execution, il n'y a pas de chaine "abcdefgh".
Il faut bien qu'elle soit quelque-part. Insinuerais-tu que c'est une
chaîne procédurale ? :) Je ne sais pas d'ailleurs si la norme autorise
implicitement ce genre de pratique, mais en général, la chaîne est bel
et bien dans le segment de données à l'exécution. Dire qu'il n'y a pas
de chaîne me semble confus, au contraire.
La chaine n'a qu'une existence pendant la compilation, c'est un initialiseur
pour un tableau. Le code ecrit est strictement equivalent a:
char tab[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 0 };
ce que tu as la, c'est juste du sucre syntaxique:
Oui. Quitte à chipoter (et être plus clair), j'aurais plutôt écris ' '
à la fin, mais oui... le sucre syntaxique, c'est super, mais ça
contribue à cacher des mécanismes qui autrement apparaîtraient plus
nettement aux débutants.
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse, l'équivalent en assembleur d'un pointeur. Quand je dis
"temporaire", je ne suppose pas qu'un emplacement mémoire temporaire est
créé à son intention (encore que le compilateur fait bien ce qu'il
veut). Mais cela me semble plus simple de l'expliquer comme cela.
Ta vision des choses est legerement differente de la realite.
Je ne crois pas.Dans ce code, au moment de l'execution, il n'y a pas de chaine "abcdefgh".
Il faut bien qu'elle soit quelque-part. Insinuerais-tu que c'est une
chaîne procédurale ? :) Je ne sais pas d'ailleurs si la norme autorise
implicitement ce genre de pratique, mais en général, la chaîne est bel
et bien dans le segment de données à l'exécution. Dire qu'il n'y a pas
de chaîne me semble confus, au contraire.
La chaine n'a qu'une existence pendant la compilation, c'est un initialiseur
pour un tableau. Le code ecrit est strictement equivalent a:
char tab[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 0 };
ce que tu as la, c'est juste du sucre syntaxique:
Oui. Quitte à chipoter (et être plus clair), j'aurais plutôt écris ' '
à la fin, mais oui... le sucre syntaxique, c'est super, mais ça
contribue à cacher des mécanismes qui autrement apparaîtraient plus
nettement aux débutants.
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse, l'équivalent en assembleur d'un pointeur. Quand je dis
"temporaire", je ne suppose pas qu'un emplacement mémoire temporaire est
créé à son intention (encore que le compilateur fait bien ce qu'il
veut). Mais cela me semble plus simple de l'expliquer comme cela.
Alexandre Bacquart écrivit :On 05/05/2011 04:19 PM, Marc Espie wrote:Dans ce code, au moment de l'execution, il n'y a pas de chaine
"abcdefgh".
Il faut bien qu'elle soit quelque-part.
Non (et cf. infra).
Ce que veut dire Marc (ÀMHA), c'est que tu devrais écrire le _tableau_
abcdefgh (ou {...}, c'est pareil) ci-dessus.
Ce qui importe, c'est que passée la phase de lecture syntaxique qui
enlève le goût sucré, il ne reste plus qu'un tableau d'élément d'un type
élémentaire, en l'occurrence char.
Et au moment de l'exécution, il n'y probablement même plus de tableau,
d'ailleurs (la norme C n'oblige pas à garder cette information, c'est la
grande différence avec d'autres langages).
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse,
Pas forcément. Si le tableau possède 3 caractères plus le 0 final), il y
a de bonnes chances que tu trouves des compilateurs pour le manipuler
directement comme un bloc de 4 bytes pour certaines opérations, par
exemple en utilisant des registres de données (qui comme tu le sais
sûrement, n'ont pas d'adresses que l'on puisse ranger dans un registre
d'addresse.) Ou bien, le compilateur va calculer tout seul l'effet du
code C, et supprimer toute référence au tableau, qui n'existera tout
simplement plus du tout (et donc n'aura pas d'adresse non plus)...
Alexandre Bacquart écrivit :
On 05/05/2011 04:19 PM, Marc Espie wrote:
Dans ce code, au moment de l'execution, il n'y a pas de chaine
"abcdefgh".
Il faut bien qu'elle soit quelque-part.
Non (et cf. infra).
Ce que veut dire Marc (ÀMHA), c'est que tu devrais écrire le _tableau_
abcdefgh (ou {...}, c'est pareil) ci-dessus.
Ce qui importe, c'est que passée la phase de lecture syntaxique qui
enlève le goût sucré, il ne reste plus qu'un tableau d'élément d'un type
élémentaire, en l'occurrence char.
Et au moment de l'exécution, il n'y probablement même plus de tableau,
d'ailleurs (la norme C n'oblige pas à garder cette information, c'est la
grande différence avec d'autres langages).
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse,
Pas forcément. Si le tableau possède 3 caractères plus le 0 final), il y
a de bonnes chances que tu trouves des compilateurs pour le manipuler
directement comme un bloc de 4 bytes pour certaines opérations, par
exemple en utilisant des registres de données (qui comme tu le sais
sûrement, n'ont pas d'adresses que l'on puisse ranger dans un registre
d'addresse.) Ou bien, le compilateur va calculer tout seul l'effet du
code C, et supprimer toute référence au tableau, qui n'existera tout
simplement plus du tout (et donc n'aura pas d'adresse non plus)...
Alexandre Bacquart écrivit :On 05/05/2011 04:19 PM, Marc Espie wrote:Dans ce code, au moment de l'execution, il n'y a pas de chaine
"abcdefgh".
Il faut bien qu'elle soit quelque-part.
Non (et cf. infra).
Ce que veut dire Marc (ÀMHA), c'est que tu devrais écrire le _tableau_
abcdefgh (ou {...}, c'est pareil) ci-dessus.
Ce qui importe, c'est que passée la phase de lecture syntaxique qui
enlève le goût sucré, il ne reste plus qu'un tableau d'élément d'un type
élémentaire, en l'occurrence char.
Et au moment de l'exécution, il n'y probablement même plus de tableau,
d'ailleurs (la norme C n'oblige pas à garder cette information, c'est la
grande différence avec d'autres langages).
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse,
Pas forcément. Si le tableau possède 3 caractères plus le 0 final), il y
a de bonnes chances que tu trouves des compilateurs pour le manipuler
directement comme un bloc de 4 bytes pour certaines opérations, par
exemple en utilisant des registres de données (qui comme tu le sais
sûrement, n'ont pas d'adresses que l'on puisse ranger dans un registre
d'addresse.) Ou bien, le compilateur va calculer tout seul l'effet du
code C, et supprimer toute référence au tableau, qui n'existera tout
simplement plus du tout (et donc n'aura pas d'adresse non plus)...
In article<4dc2b7dd$0$25128$,
Alexandre Bacquart wrote:Dans le code généré, la chaîne est accédé à travers un registre
d'adresse, l'équivalent en assembleur d'un pointeur. Quand je dis
"temporaire", je ne suppose pas qu'un emplacement mémoire temporaire est
créé à son intention (encore que le compilateur fait bien ce qu'il
veut). Mais cela me semble plus simple de l'expliquer comme cela.
Bof, bof, bof. Si tu as une variable char *s; quelque part, par exemple
globale, cette variable sera stockee quelque part en memoire. Si tu
la manipules un tant soit peu, le compilateur va charger sa valeur dans
un registre, et travailler dessus. Tu vas me dire aussi que ca fait
un pointeur temporaire ? il n'y a aucune difference par rapport au cas
du tableau precedemment cite..! donc au final, qu'est-ce qu'il y a de
si particulier concernant les tableaux ?
In article<4dc2b7dd$0$25128$426a34cc@news.free.fr>,
Alexandre Bacquart<tek512@free.DELETEME.fr> wrote:
Dans le code généré, la chaîne est accédé à travers un registre
d'adresse, l'équivalent en assembleur d'un pointeur. Quand je dis
"temporaire", je ne suppose pas qu'un emplacement mémoire temporaire est
créé à son intention (encore que le compilateur fait bien ce qu'il
veut). Mais cela me semble plus simple de l'expliquer comme cela.
Bof, bof, bof. Si tu as une variable char *s; quelque part, par exemple
globale, cette variable sera stockee quelque part en memoire. Si tu
la manipules un tant soit peu, le compilateur va charger sa valeur dans
un registre, et travailler dessus. Tu vas me dire aussi que ca fait
un pointeur temporaire ? il n'y a aucune difference par rapport au cas
du tableau precedemment cite..! donc au final, qu'est-ce qu'il y a de
si particulier concernant les tableaux ?
In article<4dc2b7dd$0$25128$,
Alexandre Bacquart wrote:Dans le code généré, la chaîne est accédé à travers un registre
d'adresse, l'équivalent en assembleur d'un pointeur. Quand je dis
"temporaire", je ne suppose pas qu'un emplacement mémoire temporaire est
créé à son intention (encore que le compilateur fait bien ce qu'il
veut). Mais cela me semble plus simple de l'expliquer comme cela.
Bof, bof, bof. Si tu as une variable char *s; quelque part, par exemple
globale, cette variable sera stockee quelque part en memoire. Si tu
la manipules un tant soit peu, le compilateur va charger sa valeur dans
un registre, et travailler dessus. Tu vas me dire aussi que ca fait
un pointeur temporaire ? il n'y a aucune difference par rapport au cas
du tableau precedemment cite..! donc au final, qu'est-ce qu'il y a de
si particulier concernant les tableaux ?
On 05/05/2011 07:20 PM, Marc Espie wrote:Bof, bof, bof. Si tu as une variable char *s; quelque part, par exemple
globale, cette variable sera stockee quelque part en memoire. Si tu
la manipules un tant soit peu, le compilateur va charger sa valeur dans
un registre, et travailler dessus. Tu vas me dire aussi que ca fait
un pointeur temporaire ? il n'y a aucune difference par rapport au cas
du tableau precedemment cite..! donc au final, qu'est-ce qu'il y a de
si particulier concernant les tableaux ?
Mon intention était plutôt de faire comprendre à l'OP que la différence
entre les 2 expressions était le nombre d'objets créés (2 dans le cas
char*, 1 dans le cas char[]). Le reste, les détails d'implémentation,
j'ai pris la liberté de croire qu'il s'en tamponnait le coquillard :)
On 05/05/2011 07:20 PM, Marc Espie wrote:
Bof, bof, bof. Si tu as une variable char *s; quelque part, par exemple
globale, cette variable sera stockee quelque part en memoire. Si tu
la manipules un tant soit peu, le compilateur va charger sa valeur dans
un registre, et travailler dessus. Tu vas me dire aussi que ca fait
un pointeur temporaire ? il n'y a aucune difference par rapport au cas
du tableau precedemment cite..! donc au final, qu'est-ce qu'il y a de
si particulier concernant les tableaux ?
Mon intention était plutôt de faire comprendre à l'OP que la différence
entre les 2 expressions était le nombre d'objets créés (2 dans le cas
char*, 1 dans le cas char[]). Le reste, les détails d'implémentation,
j'ai pris la liberté de croire qu'il s'en tamponnait le coquillard :)
On 05/05/2011 07:20 PM, Marc Espie wrote:Bof, bof, bof. Si tu as une variable char *s; quelque part, par exemple
globale, cette variable sera stockee quelque part en memoire. Si tu
la manipules un tant soit peu, le compilateur va charger sa valeur dans
un registre, et travailler dessus. Tu vas me dire aussi que ca fait
un pointeur temporaire ? il n'y a aucune difference par rapport au cas
du tableau precedemment cite..! donc au final, qu'est-ce qu'il y a de
si particulier concernant les tableaux ?
Mon intention était plutôt de faire comprendre à l'OP que la différence
entre les 2 expressions était le nombre d'objets créés (2 dans le cas
char*, 1 dans le cas char[]). Le reste, les détails d'implémentation,
j'ai pris la liberté de croire qu'il s'en tamponnait le coquillard :)
D'autre part, ce ne sont pas les points importants ici.
Ce qui importe c'est de savoir ce qu'on peut modifier legalement.
Dans char *s = "coucou"; la valeur pointee est constante.
Dans char t[] = "coucou"; c'est l'adresse qui pointe qui est constante.
D'autre part, ce ne sont pas les points importants ici.
Ce qui importe c'est de savoir ce qu'on peut modifier legalement.
Dans char *s = "coucou"; la valeur pointee est constante.
Dans char t[] = "coucou"; c'est l'adresse qui pointe qui est constante.
D'autre part, ce ne sont pas les points importants ici.
Ce qui importe c'est de savoir ce qu'on peut modifier legalement.
Dans char *s = "coucou"; la valeur pointee est constante.
Dans char t[] = "coucou"; c'est l'adresse qui pointe qui est constante.
Je suis curieux de savoir ce qui cloche dans mon propos.
Un problème de terminologie contextuelle peut-être ?
Autre chose : généralement, je préfère éviter le terme de tableau quand
je m'adresse à des débutants en C. [...] Ca complique pas mal la
nécessité d'être concis pour ne pas l'embrouiller.
Je suis curieux de savoir ce qui cloche dans mon propos.
Un problème de terminologie contextuelle peut-être ?
Autre chose : généralement, je préfère éviter le terme de tableau quand
je m'adresse à des débutants en C. [...] Ca complique pas mal la
nécessité d'être concis pour ne pas l'embrouiller.
Je suis curieux de savoir ce qui cloche dans mon propos.
Un problème de terminologie contextuelle peut-être ?
Autre chose : généralement, je préfère éviter le terme de tableau quand
je m'adresse à des débutants en C. [...] Ca complique pas mal la
nécessité d'être concis pour ne pas l'embrouiller.
Certes, tout ceci est fort joli (et réel)... il y a tellement de façons
d'optimiser. Mais ce qui m'intéresse plus particulièrement, c'est la
valeur pédagogique de mon propos initial. En quoi mon explication
tendrait à mettre le doute dans la tête l'OP, voire à lui inculquer une
fausse conception (pour ce qu'il a besoin de savoir pour l'instant) ?
Je conçois bien que cette question n'est pas vraiment le sujet de forum,
mais la pédagogie, c'est important. Je suis curieux de savoir ce qui
cloche dans mon propos. Un problème de terminologie contextuelle
peut-être ? Ne peut-on pas, au moment de l'exécution, qualifier de
chaîne un tableau de char terminé par ' ' et initialement (à la
compilation) défini comme une chaîne ?
Autre chose : généralement, je préfère éviter le terme de tableau quand
je m'adresse à des débutants en C. Je sais bien que ce terme est adéquat
dans le cadre de la norme C, mais bien souvent, les débutants en C ont
une conception des tableaux autre que celle de la norme C et ils s'y
cassent les dents assez vite. D'où mon hésitation à utiliser ce terme,
en tous cas, pas sans développer le propos. Ca complique pas mal la
nécessité d'être concis pour ne pas l'embrouiller.
Certes, tout ceci est fort joli (et réel)... il y a tellement de façons
d'optimiser. Mais ce qui m'intéresse plus particulièrement, c'est la
valeur pédagogique de mon propos initial. En quoi mon explication
tendrait à mettre le doute dans la tête l'OP, voire à lui inculquer une
fausse conception (pour ce qu'il a besoin de savoir pour l'instant) ?
Je conçois bien que cette question n'est pas vraiment le sujet de forum,
mais la pédagogie, c'est important. Je suis curieux de savoir ce qui
cloche dans mon propos. Un problème de terminologie contextuelle
peut-être ? Ne peut-on pas, au moment de l'exécution, qualifier de
chaîne un tableau de char terminé par ' ' et initialement (à la
compilation) défini comme une chaîne ?
Autre chose : généralement, je préfère éviter le terme de tableau quand
je m'adresse à des débutants en C. Je sais bien que ce terme est adéquat
dans le cadre de la norme C, mais bien souvent, les débutants en C ont
une conception des tableaux autre que celle de la norme C et ils s'y
cassent les dents assez vite. D'où mon hésitation à utiliser ce terme,
en tous cas, pas sans développer le propos. Ca complique pas mal la
nécessité d'être concis pour ne pas l'embrouiller.
Certes, tout ceci est fort joli (et réel)... il y a tellement de façons
d'optimiser. Mais ce qui m'intéresse plus particulièrement, c'est la
valeur pédagogique de mon propos initial. En quoi mon explication
tendrait à mettre le doute dans la tête l'OP, voire à lui inculquer une
fausse conception (pour ce qu'il a besoin de savoir pour l'instant) ?
Je conçois bien que cette question n'est pas vraiment le sujet de forum,
mais la pédagogie, c'est important. Je suis curieux de savoir ce qui
cloche dans mon propos. Un problème de terminologie contextuelle
peut-être ? Ne peut-on pas, au moment de l'exécution, qualifier de
chaîne un tableau de char terminé par ' ' et initialement (à la
compilation) défini comme une chaîne ?
Autre chose : généralement, je préfère éviter le terme de tableau quand
je m'adresse à des débutants en C. Je sais bien que ce terme est adéquat
dans le cadre de la norme C, mais bien souvent, les débutants en C ont
une conception des tableaux autre que celle de la norme C et ils s'y
cassent les dents assez vite. D'où mon hésitation à utiliser ce terme,
en tous cas, pas sans développer le propos. Ca complique pas mal la
nécessité d'être concis pour ne pas l'embrouiller.
Mais dans char t[] = "coucou"; l'adresse qui pointe est constante, c'est
à dire &t donc. Je ne peux pas modifier la valeur de &t. Mais est-ce que
je peux modifier "coucou"?
Mais dans char t[] = "coucou"; l'adresse qui pointe est constante, c'est
à dire &t donc. Je ne peux pas modifier la valeur de &t. Mais est-ce que
je peux modifier "coucou"?
Mais dans char t[] = "coucou"; l'adresse qui pointe est constante, c'est
à dire &t donc. Je ne peux pas modifier la valeur de &t. Mais est-ce que
je peux modifier "coucou"?