C语言中,while(*pointer)是合法的吗?

3

我最近遇到了很多使用以下语法的代码片段:

while (*pointer) { 
    ... ++pointer; 
}

我向我的讲师核实了这样做是否合适和“合法”,因为我认为当指向整数数组时,条件不会停止。

我没有得到明确的答案,如果使用这种情况是正确的,以及为什么条件起作用,我将非常感激,因为不确定在数组末尾是否会有0 / NULL来停止条件。

提前致谢。


1
因为不能确定数组的末尾是否有0 / NULL来停止条件。虽然没有一个自然法则规定一定会有终止的0。但是,如果您决定使用以0结尾的数组,则必须坚持这一点。然后由您负责正确终止您的数组。与使用未终止的字符数组和字符串函数相同。如果做错了,它将失败。如果提供错误的输入,任何其他检测数组结尾的机制都将失败。 - Gerhardh
5个回答

1
如果保证pointer指向字符串文字、包含字符串的char数组或至少有一个元素包含0值的基本类型或指针类型的数组,则是正确和合法的。但是,如果指向的数组不包含至少一个具有0值的元素,则不合法,因为由于pointer的递增,会访问数组边界之外的元素。解引用指向数组末尾之后的指针将引发未定义行为

1

好的和合法的,是的。这经常被使用。

一个例子,你想使用指针而不是索引(有时这样做有一些优势)。

计算字符串中*的数量。

int counstar(char *s) {
    int n = 0;
    while(*s) if(*s++ == '*') n++;
    return n;
}

通常,(约定)C字符串以'\0'结尾,因此您知道它在哪里结束,我只需要if (*s)即可。对于整数(以及除字符串以外的任何东西),除非已经指定(例如最后一个数字为0),否则您不知道数组的大小,并且需要一个变量来告诉大小。但是,如果您知道最后一个数字为零,例如,算法类似于上面的字符串。将x添加到n个整数中。
void addx(int *a, int x, int n) {
   while (n--) *a++ += x;
}

如果您知道最后一项始终为0(且未递增),则需要进行处理。
void addx(int *a, int x) {
   while (*a) *a++ += x;
}

0

我不知道你的指针指向什么具体类型,但除了0或NULL之外,'\0'也是零。因此,对于C类型的字符串,它也可以工作。


0

可以的,你可以这么做。请注意,*pointer是指针所指向的内存位置的值(或者说是地址)。


0
一个常见的用例是当存在一个变长指针数组时(例如动态分配的字符串数组),其大小由等于NULL的哨兵值确定。
以下是一个非常简单的示例。
#include <stdio.h>

int main( int argc, char * argv[] )
{
    while ( *argv ) puts( *argv++ );

    return 0;
}

这段代码之所以有效,是因为根据C标准(5.1.2.2.1程序启动),如果声明了main函数的参数,则必须遵守以下约束条件:
- argv[argc] 必须是空指针
...

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