Puis-je créer un tableau de pointeurs Char en C?
Je suis novice en C, et les choses sont différentes en C que dans toute autre langue que j'ai apprise. Dans mes devoirs, je veux créer un tableau de caractères qui pointent vers un tableau de caractères, mais plutôt que de faire un multidimensionnelle char tableau, je me dis que j'aurais plus de contrôle et de créer des tableaux de char et de placer chaque individu dans l'index de l'original char tableau:
char keywords[10];
keywords[0] = "float";
L'exemple ci-dessus est de clarifier et d'un cas simple. Mais ma question est en raison de la recherche que j'ai fait, et je suis confus au sujet de quelque chose. Normalement, ce serait de travailler dans d'autres langues, mais en C, il serait:
char *keyword[10];
keywords[0] = "float";
Mais quand je veux l'envoyer à travers une fonction, pourquoi est-ce nécessaire:
void function(char **keyword); //function prototype
Ne serait pas juste de passer le pointeur sur le tableau assez?
source d'informationauteur Andy
Vous devez vous connecter pour publier un commentaire.
On dirait que vous êtes confus par les étoiles doubles dans
Les étoiles doubles signifie simplement que cette fonction vous attend pour passer un pointeur vers un pointeur vers un char. Cette syntaxe ne comporte aucune information sur le fait que vous êtes à l'aide d'un tableau, ou que le char est en fait le premier caractère d'un grand nombre en une chaîne de caractères. C'est à vous en tant que programmeur de savoir quel type de structure de données cette
char **
en fait des points.Par exemple, supposons que le début de votre tableau est stocké à l'adresse 0x1000. Le
keyword
argument de la fonction doit avoir une valeur de 0 x 1000. Si vous déréférencement dekeyword
vous obtenez la première entrée dans le tableau, qui est unechar *
qui pointe vers le premier caractère dans la chaîne "float". Si vous déréférencer lechar *
vous obtenez le char "f".L' (fictive) code ressemblerait à:
Il y avait deux pointeurs dans l'exemple ci-dessus. En ajoutant un décalage vers le premier pointeur avant d'être déréférencé, vous pouvez accéder aux différentes chaînes de caractères dans le tableau. En ajoutant un offset à la deuxième pointeur avant d'être déréférencé, vous pouvez accéder à différentes caractère dans la chaîne.
keyword
est un tableau de 10 dechar *
. Dans un contexte de valeurs, il a converti en un pointeur vers unchar *
.Cette conversion est une partie de ce que Chris Torek appels "La Règle":
Voir ici pour plus d'informations: http://web.torek.net/torek/c/pa.html
Le C-FAQ a aussi un article sur ce tableau de pointeur de conversion:
http://c-faq.com/aryptr/aryptrequiv.html
Si vous voulez
Andy, penser qu'un tableau est un pointeur(pour le début du tableau), c'est pourquoi vous écrivez:
Parce que vous avez créer un tableau de pointeurs de char.
Si c'est plus facile à comprendre, essayez:
Mais c'est plus C standard à utiliser la première, bien que si vous utilisez un compilateur C++ ne sera pas vraiment d'importance.
Voici la réponse.
En C, on ne peut pas vraiment passer un tableau à une fonction. Au lieu de cela, vous passez un pointeur vers le début du tableau. Depuis votre tableau de
char*
la fonction sera d'obtenir un pointeur verschar*
qui estchar**
.Si vous le souhaitez, vous pouvez écrire (dans le prototype)
char *keyword[]
au lieu dechar **keyword
. Le compilateur va automatiquement convertir.Aussi, en C, vous pouvez déréférencement de pointeurs comme des tableaux, donc vous perdez presque rien avec cette "conversion de pointeur".
char *keywords[10]
est un tableau de pointeurs de caractère. Donckeywords[0]
keywords[1]
.. et ainsi de suite ont les adresses de différents tableaux de caractères.Dans
printf
vous pouvez utiliser%s
etkeywords[0]
imprimer l'ensemble du tableau de caractères dont l'adresse(c'est à dire l'adresse du premier octet dans le tableau) est stocké àkeywords[0]
.En passant à une fonction, si vous donnez
*keywords
vous faites référence à l' valeur à(adresse stockée àkeywords[0]
) qui est encore une fois une adresse. Donc, pour obtenir la valeur à la place de l'adresse, vous pouvez ajouter un autre*
... j'Espère que précise un peu..