我最近看到了很多使用while(*pointer)的代码片段。
while (*pointer) {
... ++pointer;
}
我和我的讲师检查了一下,这样的操作是否合法,因为我认为在指向整数数组的指针的情况下,条件不会停止。
我不能得到一个明确的答案,我会感谢任何答案,如果它是正确的使用这种情况下,为什么条件的工作,因为它是不确定的,在数组的结束将是0 NULL,将停止的条件。
先谢谢你了。
好和合法,是的。这个用得很多。
举个例子,你想用指针代替索引(有时有一些好处)。
计数 *
连成一串
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;
}
"是
while(*pointer)
在C区合法吗?"
如果 pointer
确保指向一个字符串字面,一个数组的 char
含有字符串的数组,或至少有一个元素含有字符串的基本型或指针型数组。0
值,那么它是正确的和合法的。
但是,如果指向的数组没有包含至少一个带有 0
值),这是不合法的,因为在这种情况下,你将会访问超出数组边界的元素,由于 pointer
. 要取消引用一个指针,指向数组的末端,可以调用 未定义行为:
"如果结果指向数组对象的最后一个元素,则不得将其作为单数组的操作数。
*
被评估的操作者"。"资料来源:ISOIEC 9899:2011(C11),6.5.68。ISOIEC 9899:2011 (C11), 6.5.68
我不知道你的指针指向什么具体类型,但execpt 0或NULL,'/0'也是0。所以对于C类型的字符串,它也可以工作。
一个经常使用的情况是,当有一个可变长度的指针数组(例如一个动态分配的字符串数组)时,它的大小由等于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]是一个空指针。 ,,,
是的,你可以去做。请注意 *pointer
是内存位置的值 pointer
指向(或持有地址)。