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

问题描述 投票:0回答:1

我最近看到了很多使用while(*pointer)的代码片段。

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

我和我的讲师检查了一下,这样的操作是否合法,因为我认为在指向整数数组的指针的情况下,条件不会停止。

我不能得到一个明确的答案,我会感谢任何答案,如果它是正确的使用这种情况下,为什么条件的工作,因为它是不确定的,在数组的结束将是0 NULL,将停止的条件。

先谢谢你了。

c pointers while-loop
1个回答
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;
}

1
投票

"while(*pointer) 在C区合法吗?"

如果 pointer 确保指向一个字符串字面,一个数组的 char 含有字符串的数组,或至少有一个元素含有字符串的基本型或指针型数组。0 值,那么它是正确的和合法的。

但是,如果指向的数组没有包含至少一个带有 0 值),这是不合法的,因为在这种情况下,你将会访问超出数组边界的元素,由于 pointer. 要取消引用一个指针,指向数组的末端,可以调用 未定义行为:

"如果结果指向数组对象的最后一个元素,则不得将其作为单数组的操作数。* 被评估的操作者"。

"资料来源:ISOIEC 9899:2011(C11),6.5.68。ISOIEC 9899:2011 (C11), 6.5.68


0
投票

我不知道你的指针指向什么具体类型,但execpt 0或NULL,'/0'也是0。所以对于C类型的字符串,它也可以工作。


0
投票

一个经常使用的情况是,当有一个可变长度的指针数组(例如一个动态分配的字符串数组)时,它的大小由等于NULL的哨兵值决定。

下面是一个非常简单的例子

#include <stdio.h>

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

    return 0;
}

这样做的原因是根据C标准(5.1.2.2.1程序启动)。

2 如果声明了这些参数,则主函数的参数应遵守以下约束条件:...。

argv[argc]是一个空指针。 ,,,


0
投票

是的,你可以去做。请注意 *pointer 是内存位置的值 pointer 指向(或持有地址)。

© www.soinside.com 2019 - 2024. All rights reserved.