我最近遇到了很多使用以下语法的代码片段:
while (*pointer) {
... ++pointer;
}
我向我的讲师核实了这样做是否合适和“合法”,因为我认为当指向整数数组时,条件不会停止。
我没有得到明确的答案,如果使用这种情况是正确的,以及为什么条件起作用,我将非常感激,因为不确定在数组末尾是否会有0 / NULL来停止条件。
提前致谢。
我最近遇到了很多使用以下语法的代码片段:
while (*pointer) {
... ++pointer;
}
我向我的讲师核实了这样做是否合适和“合法”,因为我认为当指向整数数组时,条件不会停止。
我没有得到明确的答案,如果使用这种情况是正确的,以及为什么条件起作用,我将非常感激,因为不确定在数组末尾是否会有0 / NULL来停止条件。
提前致谢。
pointer
指向字符串文字、包含字符串的char
数组或至少有一个元素包含0
值的基本类型或指针类型的数组,则是正确和合法的。但是,如果指向的数组不包含至少一个具有0
值的元素,则不合法,因为由于pointer
的递增,会访问数组边界之外的元素。解引用指向数组末尾之后的指针将引发未定义行为:好的和合法的,是的。这经常被使用。
一个例子,你想使用指针而不是索引(有时这样做有一些优势)。
计算字符串中*
的数量。
int counstar(char *s) {
int n = 0;
while(*s) if(*s++ == '*') n++;
return n;
}
'\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或NULL之外,'\0'也是零。因此,对于C类型的字符串,它也可以工作。
可以的,你可以这么做。请注意,*pointer
是指针所指向的内存位置的值(或者说是地址)。
#include <stdio.h>
int main( int argc, char * argv[] )
{
while ( *argv ) puts( *argv++ );
return 0;
}