Bonjour,
quelle est la différence entre ces trois notations ?
1.char **argv
2.char *argv[]
3.char* argv[]
Merci pour vos explications :-)
cdt
Bonjour,
quelle est la différence entre ces trois notations ?
1.char **argv
2.char *argv[]
3.char* argv[]
Merci pour vos explications :-)
cdt
Aucune
Mais char argv[]; déclare un pointeur, char argv[] = {'a', 'r', 'r', 'a', 'y'}; défini un tableau (argv est un pointeur sur la 1ière case du tableau )
Il n'y a aucune différence entre la 2. et la 3. Seule varie la position de l'espace séparateur, qui n'a aucune signification lexicale. Cependant, on préférera quand même la 2. car l'étoile s'applique à l'identificateur qui la suit immédiatement. Par exemple « char* a,b; » sera en fait équivalent à « char *a, b », soit un pointeur et un caractère.
En revanche, la première définit « un pointeur vers un pointeur vers un char », le premier pointeur pouvant éventuellement pointer en fait une liste de pointeurs consécutifs en mémoire. Les deux autres, en revanche, définissent un tableau de pointeurs. Ça signifie que tu ne pourras pas écrire simplement « char * argv[] » : il faudra soit indiquer la taille de ce tableau entre les crochets, soit l'initialiser à la déclaration avec « = { …, …, … }; », ce bloc donnant implicitement la taille du tableau, soit les deux à la fois.
Il est important de remarquer que lorsque tu déclares un tableau, tu ne réserves que la place nécessaire à ses éléments. Le nom du tableau (son identifiant) est alors une expression de type pointeur dont la valeur est l'adresse du tableau en mémoire et c'est ce qui te permet de l'indexer avec les crochets « [ ] » pour accéder à ses éléments, mais il ne s'agit pas d'une variable propre, que tu pourrais faire pointer ailleurs. Comme le tableau est connu à la compilation, tu n'en as pas besoin : le compilateur est capable de savoir directement où chercher lorsque tu l'invoques au sein d'une fonction où il est visible.
Par contre, un tableau n'est pas en soi un type de données et il n'est pas possible de recopier directement un tableau dans un autre à l'aide de « = ». Ça veut dire que si tu passes un tel tableau en tant que paramètre d'une fonction, comme le tableau en question ne sera pas directement visible par la fonction et ne sera pas connu à la compilation, alors il faudra passer l'adresse de ce tableau à ta fonction au runtime. Dès lors, uniquement dans le cas des paramètres de fonction, tes expressions 2. et 3. seront équivalentes à la 1. et ton paramètre sera une authentique variable pointeur.
Excellent! Merci pour ces explications !!! vraiment top ! merci mille fois
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager