[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] [devel] Petit soucis avec C.
Voici un extrait de la aq du newsgroup plein de ressources dont je t'avais
parlé
5.8 Quelle est la différence entre char a[] et char * a ?
Il faut bien se rappeler qu'en C, un tableau n'est pas un pointeur, même si
à l'usage ça y ressemble beaucoup.
char a[] déclare un tableau de char de taille inconnue (type incomplet). Dès
l'initialisation, par
char a[] = "Hello";
a se transforme en char[6], soit un tableau de six char (type complet).
Il arrive souvent de voir la confusion entre « tableau » et « pointeur
constant » (moi même je la fait parfois ;-) )
Ce « pointeur constant » est inspiré par K&R, 1ère édition. C'était une
métaphore malheureuse de K&R qui voulait exprimer qu'un tableau se comporte
en général comme une « valeur (rvalue) du type pointeur », et bien entendu
une valeur est toujours constante. Par cette métaphore ils ont essayé
d'expliquer pourquoi on ne pouvait pas prendre l'adresse d'un tableau.
Malheureusement ceci n'explique pas pourquoi sizeof a donne la taille du
tableau et non la taille d'un pointeur.
Sur ce sujet, la norme est plus précise en disant qu'un tableau dans une
expression --- sauf dans &a ou sizeof a ou dans des initialisations par des
chaînes littérales "xyz" --- est converti automatiquement en une valeur du
type pointeur qui pointe sur l'élément initial du tableau (merci à Horst
Kraemer pour ces précisions).
CHARLIER Philippe wrote:
> Bonjour a tous,
>
> Je suis toujours en train d'essayer de comprendre le C (sous Linux
> off-course). J'ai quelques soucis avec les pointeurs :-).
>
> J'ai ecrit le pgm suivant, pour un peu voir comment cela fonctionne :
>
> ----------------------------------------------------
> #include <stdio.h>
>
> int main (int argc, char **argv)
> {
> char **p_char;
> char *pointeur;
> int i;
>
> *p_char = "Bonjour";
> *(p_char + 1) = "Hello";
> *(p_char + 2) = "Goeiedag";
>
> for ( i=0; i <= 2; i++)
> {
> pointeur = *(p_char + i);
>
> printf("Affichage de *(pchar+%d) : %s.\n", i, pointeur );
> }
>
> printf("test.\n");
>
> return 0;
> }
> ----------------------------------------------------
>
> Le programme une fois execute me sort ceci :
>
> Affichage de *(pchar+0) : Bonjour.
> Affichage de *(pchar+1) : Hello.
> Affichage de *(pchar+2) : Goeiedag.
> test.
> Abandon
>
> ???????? D'ou vient ce "Abandon" ???????
>
> Merci.
>
> Philippe
>
> [ Soyez précis dans vos sujets svp afin de déterminer directement ]
> [ le type de demande... ]
> [ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php ]
> [ http://LinuxBe.org Contact: listmaster@linuxbe.org ]
[ Soyez précis dans vos sujets svp afin de déterminer directement ]
[ le type de demande... ]
[ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php ]
[ http://LinuxBe.org Contact: listmaster@linuxbe.org ]