Comment puis-je utiliser des pointeurs vers des chaînes d'affichage dans un tableau?
Je pratique à l'aide de pointeurs.
J'ai un pointeur sur un tableau de 3 chaînes: "chien", "chat", "rat".
Je peux imprimer le contenu à l'aide d'un for
boucle et à l'aide d'un tableau.
Cependant, je vais avoir des problèmes d'impression en utilisant l'arithmétique des pointeurs. Je tiens à incrémenter le pointeur vers l'élément suivant du tableau. Cependant, tout ce qu'il fait est d'imprimer le chien lettres.
Code:
int main(int argc, char **argv)
{
char *str[3] = { "DOG", "CAT", "RAT"};
int i = 0;
/* display using an array element */
for(i = 0; i < 3; i++)
{
printf("str: %s\n", str[i]);
}
/* display using a pointer arthimatic */
while((*str)++)
{
printf("str: %s\n", str);
}
getchar();
return 0;
}
Comment puis-je y arriver?
Edit:
Code:
while(str)
{
printf("str: %s\n", *(str++));
}
Cependant, j'obtiens ce message d'erreur. Ne pas le I-valeur doivent être une variable d'une certaine sorte?
erreur C2105: '++' des besoins de la l-valeur
il est de bonne pratique de ne pas incrémenter str, mais une variable de boucle qui est initialisé avec des str, de sorte que vous pouvez accéder str plus tard encore. char *boucle = str; while (boucle)...
Voir ma réponse ci-dessous: souligné pourquoi vous obtenez ce message d'erreur.
Voir ma réponse ci-dessous: souligné pourquoi vous obtenez ce message d'erreur.
OriginalL'auteur ant2009 | 2009-03-18
Vous devez vous connecter pour publier un commentaire.
Vous devez d'abord obtenir un pointeur, et vous avez besoin d'une condition d'y mettre fin. Un dernier pointeur NULL peut être utilisée pour cela. Ainsi, le code devient
Ce que vous avez fait était pour incrémenter le pointeur stocké dans le tableau du premier élément. Le pointeur ne sera jamais trop tôt égale à un pointeur null (si), Donc, la boucle ne s'arrêtera pas jusqu'à ce que les pointeurs internes de la valeur des débordements ou quelque chose se passe afin qu'il corresponde à un pointeur null. Ensuite, vous passez un pointeur vers le premier élément de rangées de
printf
(vous transmettre le tableau, mais le compilateur convertit un pointeur - voir ci-dessous).Printf
interpréter les octets de ces pointeurs, les personnages et de les imprimer, ce qui entraînera des ordures imprimé si il ne plante pas tout de suite.Vous voulez incrémenter à un niveau supérieur à la place: Incrément pas un seul élément (pointeur) de la matrice, mais le pointeur de la éléments. Maintenant, vous ne pouvez pas faire
Parce que
str
est un tableau. Il n'est pas un pointeur, même si il peut être converti en un pointeur, ce qui sera alors le point de le premier élément. Ainsi, nous créons un pointeur qui pointe versstr[0]
au départ, mais l'incrémenter le tout à nouveau. Notez que nous incrémenter après l'impression, de sorte que nous imprimons le premier élément de trop.En fait, je pense que je devrais expliquer pourquoi vous ne pouvez pas faire
str++
. Eh bien,str
est un tableau. Un tableau est un objet qui occupe une quantité fixe de stockage. Ci-dessus, le tableau occupe 4 fois la taille d'un pointeur de char,4 * sizeof(char*)
. Ce qui ressemble à un pointeur sur le premier coup d'œil est un bloc d'éléments du même type. Pour l'adressage des éléments, le compilateur peut faire jusqu'à un pointeur d'un tableau dans les expressions, qui peuvent ensuite être utilisés pour traiter les éléments dans le tableau. Si vous nestr++
, le compilateur va créer un pointeur pour vous. Mais le pointeur est temporaire, n'existe que pour une courte période de temps pour le seul but d'immédiatement faire quelque chose avec elle, mais il ne peut pas être changé comme étant incrémenté. C'est la raison pour laquelle nous créer un vrai pointeur de variable que nous avons ensuite augmenter.oups, oui s'il vous plaît 🙂 le meilleur il suffit de laisser vide. la taille de la matrice sera calculé automatiquement.
j'ai mal lu votre code. j'ai pensé que vous ne printf("str: %s\n", *str); ce qui aurait imprimé OG, G, et ainsi de suite. maintenant, avec seulement str, je m'attends à ce qu'il imprimer poubelle (car elle permettrait d'interpréter les pointeurs comme des caractères).
Bonjour, quelle est la différence entre char *animaux[] = {"chien", "chat", 0}; int nombre[] = {1, 2, 3}; Pourquoi ai-je besoin de l' * pour char. Et je n'ai pas besoin pour l'int? *Pour les animaux[]. Je suis la création de 1 pointeur qui va pointeur vers un certain nombre de différents éléments dans un tableau? Merci
la priorité de l'opérateur[] et l'opérateur*. char *p[] est lu en tant que déclarant p comme un "tableau de ...". pour faire un "pointeur sur tableau de..." vous n'char (*p)[] . mais cela ne fait pas de sens dans votre code. il est utile dans de multiples dimensions des tableaux. mais je soupçonne que c'est plus de confusion que de bien à ce moment.
OriginalL'auteur Johannes Schaub - litb
Le problème avec ton code, c'est que vous êtes à incrémenter le pointeur déréférencé str, ce qui vous donne un char * pour le premier élément du tableau (c'est à dire, chien).
Vous devriez être en incrémentant str elle-même, pas ce qu'il désigne.
Cependant votre boucle de contrôle de l'arrêt ne fonctionne pas dans ce cas car il n'existe aucun élément dans le tableau au moment où l'str == 0 est vraie. Afin d'obtenir que cela fonctionne, vous aurez besoin d'ajouter un quatrième élément du tableau est 0.
OriginalL'auteur Timo Geusch
str
, étant un tableau, ne peut être incrémentée.Droit maintenant, vous êtes à l'incrémentation de la
(*str)
, qui eststr[0]
: le premier élément de ce tableau. Depuis que cet élément est un pointeur, vous êtes l'incrémentation du pointeur, faisant référence les éléments suivants de la chaîne "CHIEN".Ce que vous avez besoin est un pointeur peut pointer (et donc de marcher sur)
str
'éléments. Puisque les éléments sontchar*
, le pointeur seraitchar**
- un double pointeur.OriginalL'auteur aib
Incrémente la valeur pointée par
s
. Vous aurez besoin d'incrémenter le pointeur lui-même et imprimer la valeur de la pointee. Remarque, ce str n'est pas une l-value et vous ne pouvez pas l'incrémenter.Aussi, si vous incrément d'abord, puis, vous êtes de gauche avec seulement deux chaînes que vous pouvez imprimer. Vous appelez UB après.
Essayez ceci:
Rechercher la priorité de l'opérateur et de liaison dans C.
OriginalL'auteur dirkgently
Ce incréments *str qui est la lettre "d". Vous ne voulez pas le faire. Vous voulez incrémenter le pointeur. Ce code devrait faire ce que vous voulez:
OriginalL'auteur Steve Rowe