Ce n'while(*pointeur) signifie en C?
Quand j'ai regarder quelques passage sur C les pointeurs, j'ai trouvé quelque chose d'intéressant. Ce qu'il dit est, un code comme ceci:
char var[10];
char *pointer = &var;
while(*pointer!='char var[10];
char *pointer = &var;
while(*pointer!='\0'){
//Something To loop
}
'){
//Something To loop
}
Peut être transformé en ceci:
//While Loop Part:
while(*pointer){
//Something to Loop
}
Donc, mon problème est, qu'est - *pointeur signifie?
*pointer
"points" pour le premier caractère de la chaîne var
; lorsque le premier caractère est 0 (numériquement, pas le caractère '0'), de sortir de la boucleOuvert toute C livre et de lire attentivement la partie qui explique
while
..... et j'espère que C livre explique également pourquoi vous ne devriez pas faire cela parce qu'il conduit à exactement ce genre de confusion 😉
OriginalL'auteur Program5284 | 2015-08-22
Vous devez vous connecter pour publier un commentaire.
sera exécuté
do_something()
à plusieurs reprises, tant quex
est vrai. En C, le "vrai" signifie "pas de zéro".'\0'
est un caractère nul. Numériquement, c'est le zéro (les bits qui représente'\0'
est le même que le nombre de zéro; tout comme un espace est le nombre 0x20 = 32).Si vous avez
while(*pointer != '\0')
. Tandis que la pointe-à -la mémoire n'est pas un zéro octet. Plus tôt, j'ai dit "vrai" signifie "non-zéro", de sorte que la comparaisonx != 0
(six
estint
,short
, etc.) oux != '\0'
(six
estchar
), les mêmes que justex
à l'intérieur d'un if, while, etc.Devriez-vous utiliser ce formulaire plus court? À mon avis, non. Il en fait de moins en moins claires à quelqu'un de lire le code que l'intention est. Si vous écrivez la comparaison explicitement, il est beaucoup plus évident que l'intention de la boucle, même si techniquement ils signifient la même chose pour le compilateur.
Donc si vous écrivez
while(x)
,x
doit être un booléen ou un C int qui représente une valeur booléenne (vrai ou faux concept) déjà. Si vous écrivezwhile(x != 0)
, puis vous vous souciez dex
étant un entier différent de zéro et sont en train de faire quelque chose de numérique avecx
. Si vous écrivezwhile(x != '\0')
, puisx
est unchar
et que vous voulez continuer jusqu'à ce que vous trouver un caractère null (vous êtes probablement le traitement d'une chaîne C).OriginalL'auteur Laogeodritt
*pointer
moyens de déréférencement de la valeur stockée à l'emplacement pointé parpointer
. Lorsquepointer
pointe vers une chaîne et utilisé danswhile
boucle commewhile(*pointer)
, il est équivalent àwhile(*pointer != '\0')
: boucle util terminateur null s'il est trouvé.OriginalL'auteur haccks
Oui, vous pouvez aller pour elle.
Veuillez noter que
*pointer
est la valeur à l'emplacement de la mémoire de lapointer
point(ou contenir l'adresse de l').Votre
*pointer
est maintenant pointant vers chacun des caractères du tableau de caractèresvar
.Donc,
while(*pointer)
est une abréviation de l'utilisation de l'équivalentSupposer, votre chaîne est initialisée à 9 caractères dire "123456789" et situé à une adresse de dire
addr
(emplacement de la mémoire).Maintenant, à cause de la déclaration:
pointer
pointe vers le premier élément de la chaîne "1234567890".Lorsque vous écrivez le
*pointer
, elle récupère la valeur stockée à l'emplacement de la mémoireaddr
qui est1
.Maintenant, l'instruction:
sera équivalent à
parce que la Valeur ASCII de
1
est de 49, et la condition est évaluée à vrai.Cela continuera jusqu'à ce que
\0
personnage est atteint après l'incrémentationpointer
pour neuf fois.Maintenant, l'instruction:
sera équivalent à
parce que la valeur ASCII de
\0
est0
. Ainsi, la condition est évaluée à faux et la boucle s'arrête.Résumé:
Dans
while(condition)
,condition
doit être non nul de poursuivre l'exécution de la boucle. Sicondition
évalue àzero
puis la boucle s'arrête l'exécution.while(*pointer)
travaillera jusqu'à la valeur de l'emplacement de mémoire d'être souligné est unnon-zero
valeur ASCII.Aussi, vous pouvez utiliser:
OriginalL'auteur TryinHard
*pointer
signifie exactement ce qu'il dit: "Donnez-moi la valeur stockée à l'endroit que le pointeur pointe vers". Ou de "déréférencerpointer
" pour faire court. Dans votre exemple concret, le déréférencement de pointeur produit l'un des caractères dans une chaîne.while(*pointer)
signifie aussi exactement ce qui est dit: "Alors que l'expression*pointer
donne une vraie valeur, exécuter le corps de la boucle".Depuis C considère toutes les valeurs non nulles comme vrai, à l'aide de
*pointer
dans un condition est toujours équivalent à l'utilisation de l'expression*pointer != 0
. Par conséquent, de nombreux programmeurs C omettre le!= 0
partie afin de mettre en pratique boolean zen.OriginalL'auteur cmaster
Commençons par un exemple simple::
De la même façon, votre code est de travailler avec
char*
, une chaîne de caractères.Donc, la boucle sera exécutée jusqu'à
*pointer
de ne pas frapper'\0'
.Mais l'usage peut changer lorsque vous le faites,
while(*pointer != 'x'), where x can be any char
. Dans ce cas, votre premier code de sortie après*pointer hits the 'x' char
mais votre deuxième extrait de courir jusqu'à*pointer hits '\0' char
.OriginalL'auteur Abhineet