在C语言中,while(*pointer)代表什么意思?

10
当我最近看了一些关于C指针的文章时,发现了一些有趣的事情。它所说的是这样一段代码:
char var[10];
char *pointer = &var;
while(*pointer!='\0'){
    //Something To loop
}

可以转化为以下内容:

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

因此,我的问题是,*pointer 是什么意思?它涉及到 IT 技术方面。

3
*pointer指向字符串变量var的第一个字符;当第一个字符为0(数值上而言,不是字符'0'),则退出循环。 - gengisdave
1
希望那本C语言书也能解释为什么不应该这样做,因为这会导致恰好这种混淆的情况 ;) - dhke
5个回答

26
while(x) {
    do_something();
}

只要x为真,就会重复运行do_something()。在C语言中,“真”意味着“非零”。

'\0'是空字符。从数值上看,它是零(表示'\0'的位与数字零相同;正如空格是0x20 = 32一样)。

所以你有while(*pointer != '\0')。只要被指向的内存不是零字节,就会循环执行。前面我说过“真”意味着“非零”,因此比较x != 0(如果xintshort等)或x != '\0'(如果xchar)与if、while等中的x本质上是相同的。

你应该使用这种更短的形式吗?我的意见是否定的。对于阅读代码的人来说,这使得意图不太清晰。如果你明确写出比较,即使它们在编译器上实际上意义相同,也会使循环的意图变得更加明显。

因此,如果你写 while(x),那么x应该是一个布尔类型或代表布尔类型的C int(真或假概念)。如果你写while(x != 0),那么你关心x是一个非零整数,并且正在进行一些数字处理。如果你写while(x != '\0'),那么x是一个char,你希望继续执行,直到找到一个空字符(你可能正在处理一个C字符串)。


2
“非0”答案是这种情况下OP所需的正确答案,因此+1。 - pablo1977

3

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

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') 时,用法就会改变,其中 x 可以是任何字符。在这种情况下,你的第一段代码将在 *pointer 到达 'x' 字符 后退出,而你的第二段代码将一直运行,直到 *pointer 到达 '\0' 字符


3

*pointer 的意思是解引用指向 pointer 所指位置的值。当 pointer 指向一个字符串并在 while 循环中使用,如 while(*pointer),它等同于 while(*pointer != '\0'):循环直到找到空终止符。


1

是的,你可以去做。

请注意,*pointer 是指向内存位置的值,该位置由 pointer 指向(或保存其地址)。

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

因此,while(*pointer) 是等效用法的速记形式

while(*pointer!='\0').

假设你的字符串初始化为9个字符,比如"123456789",并位于一个地址(内存位置)addr

现在,因为以下语句:

char *pointer=&var;

指针将指向字符串“1234567890”的第一个元素。

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

现在,这个语句:

while(*pointer)

将等同于

while(49)

因为数字 1 的 ASCII 值为 49,且条件被评估为 true

这将继续进行,直到增加 pointer 九次后达到 \0 字符。

现在,该语句为:

while(*pointer)

将等同于

while(0)

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

摘要

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

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

  • 此外,您还可以使用:

    if(*ptr){     //而不是 if(*ptr!='\0')
      //做某事
    }
    
    if(!*ptr){     //而不是 if(*ptr=='\0')
      //做某事
    }
    

0

*pointer 的意思就是字面上的意思:“给我指针所指向的位置存储的值”。或者简称为“解引用 pointer”。在你具体的例子中,解引用指针会产生字符串中的一个字符。

while(*pointer) 也是字面上的意思:“只要表达式 *pointer 返回真值,就执行循环体”。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接