while(*指针)在C中的含义是什么?

时间:2015-08-22 07:47:54

标签: c loops pointers

当我最近看一些关于C指针的段落时,我发现了一些有趣的东西。它说的是这样的代码:

char var[10];
char *pointer = &var;
while(*pointer!='\0'){
    //Something To loop
}

可以变成这个:

//While Loop Part:
while(*pointer){
    //Something to Loop
}

所以,我的问题是, *指针是什么意思?

5 个答案:

答案 0 :(得分:14)

while(x) {
    do_something();
}
只要do_something()为真,

就会重复运行x。在C中,“true”表示“不为零”。

'\0'是一个空字符。在数值上,它为零(表示'\0'的位与零号相同;就像空格是数字0x20 = 32)。

所以你有while(*pointer != '\0')。虽然指向内存不是零字节。之前,我说“true”表示“非零”,因此比较x != 0(如果xintshort等)或{{1} (如果x != '\0'x)与if,while等中的char相同。

你应该使用这个较短的表格吗?在我看来,没有。这使得阅读代码的人不太清楚其意图是什么。如果你明确地编写了比较,那么循环的意图就更明显了,即使它们在技术上对编译器意味着同样的东西。

因此,如果你编写xwhile(x)应该是一个布尔值或一个C int,它已经表示一个布尔值(一个真或假的概念)。如果你写x,那么你关心while(x != 0)是一个非零整数,并且正在用x做一些数字。如果您编写x,那么while(x != '\0')就是x,您希望继续前进,直到找到空字符(您可能正在处理C字符串)。

答案 1 :(得分:1)

*pointer表示取消引用pointer指向的位置存储的值。当pointer指向字符串并在while循环中使用while(*pointer)时,它等同于while(*pointer != '\0'):如果找到,则返回loop util null终结符。

答案 2 :(得分:0)

是的,你可以选择它。

请注意,*pointerpointer指向的内存位置的值(或保留地址)。

您的*pointer现在指向字符数组var的各个字符。

因此,while(*pointer)是等效

的简写用法
while(*pointer!='\0').

假设您的字符串初始化为9个字符,请说" 123456789"并且位于地址addr(记忆位置)。

现在因为声明:

char *pointer=&var;

pointer将指向字符串的第一个元素" 1234567890"。

当您编写*pointer时,它将检索存储在addr的内存位置1的值。

现在,声明:

while(*pointer)

将等同于

while(49)

因为1的ASCII值为49,条件评估为 true

在将\0增加九次后,这将持续到达pointer个字符。

现在,声明:

while(*pointer)

将等同于

while(0)

因为\0的ASCII值为0。因此,条件评估为 false 并且循环停止。

<强>摘要

  • while(condition)中,condition必须为非零才能继续循环执行。如果condition求值为zero,则循环停止执行。

  • while(*pointer)将一直有效,直到指向内存位置的值为non-zero ASCII值。

  • 您也可以使用:

    if(*ptr){     //instead of if(*ptr!='\0')
      //do somthing
    }
    
    if(!*ptr){     //instead of if(*ptr=='\0')
      //do somthing
    }
    

答案 3 :(得分:0)

*pointer正是它所说的:&#34;给我存储在指针所指向的地方的价值&#34;。或者&#34;解除引用pointer&#34;简而言之。在您的具体示例中,取消引用指针会生成字符串中的一个字符。

while(*pointer)也意味着所说的内容:&#34;当表达式*pointer产生一个真值时,执行循环体&#34;。

由于C将所有非零值视为true,因此在条件中使用*pointer始终等效于使用表达式*pointer != 0。因此,许多C程序员省略!= 0部分以练习布尔禅。

答案 4 :(得分:0)

让我们从一个简单的例子::

开始
int a = 2 ;
int *b = &a ;
/* Run the loop till *b i.e., 2 != 0 
Now, you know that, the loop will run twice 
and then the condition will become false 
*/
while( *b != 0 )
{
 *b-- ;
}

同样,您的代码使用的是char*字符串。

char var[10] ;
/* copy some string of max char count = 9, 
and append the end of string with a '\0' char.*/
char *pointer = &var ;
while( *pointer != '\0' )
{
 // do something
 // Increment the pointer 1 or some other valid value
}

因此,while循环将一直运行直到*pointer没有击中'\0'

while( *pointer )
/* The above statement means the same as while( *pointer != '\0' ),
because, null char ('\0') = decimal value, numeric zero, 0*/

但是当你这样做时while(*pointer != 'x'), where x can be any char会改变用法。在这种情况下,您的第一个代码将在*pointer hits the 'x' char之后退出,但您的第二个代码段会一直运行到*pointer hits '\0' char