while(*指针)在C中合法吗?
我最近遇到了许多代码片段,它们使用:while(*指针)在C中合法吗?,c,pointers,while-loop,language-lawyer,C,Pointers,While Loop,Language Lawyer,我最近遇到了许多代码片段,它们使用: while (*pointer) { ... ++pointer; } 我和我的讲师一起检查了执行这样一个操作是否良好和“合法”,因为我认为在指针指向整数数组的情况下,条件不会停止 我无法得到一个明确的答案,如果使用这种情况是正确的,并且为什么条件有效,我将非常感谢任何答案,因为不确定数组末尾的0/NULL是否会停止条件 提前谢谢。好的,合法的,是的。这是经常使用的 例如,您希望使用指针而不是索引(这有时有一些优点) 计算字符串中*的数量 in
while (*pointer) {
... ++pointer;
}
我和我的讲师一起检查了执行这样一个操作是否良好和“合法”,因为我认为在指针指向整数数组的情况下,条件不会停止
我无法得到一个明确的答案,如果使用这种情况是正确的,并且为什么条件有效,我将非常感谢任何答案,因为不确定数组末尾的0/NULL是否会停止条件
提前谢谢。好的,合法的,是的。这是经常使用的 例如,您希望使用指针而不是索引(这有时有一些优点) 计算字符串中
*
的数量
int counstar(char *s) {
int n = 0;
while(*s) if(*s++ == '*') n++;
return n;
}
通常,(约定)C字符串以'\0'
结尾,因此您知道它的结尾,如果(*s)就足够了
对于整数(以及除字符串以外的任何内容),除非指定了它(例如最后一个数字是0
),否则您不知道数组的大小,需要一个变量来说明大小。然而,例如,如果您知道最后一个是零,那么algo将类似于上面的字符串1
将x和n个整数相加
void addx(int *a, int x, int n) {
while (n--) *a++ += x;
}
如果您知道最后一项始终为0
(且不递增)
我不知道你的指针指向什么具体类型,但execpt 0或NULL,“\0”也是零。因此,对于C类型的字符串,它也可以工作。一个常见的用例是,当指针的长度可变数组(例如动态分配的字符串数组)的大小由等于NULL的sentinel值确定时 下面是一个非常简单的例子
#include <stdio.h>
int main( int argc, char * argv[] )
{
while ( *argv ) puts( *argv++ );
return 0;
}
#包括
int main(int argc,char*argv[])
{
while(*argv)put(*argv++);
返回0;
}
这是因为根据C标准(5.1.2.2.1程序启动)
2如果已声明,则主功能的参数应遵守
以下限制:
-argv[argc]应为空指针
,
“while(*指针)在C中合法吗?”
如果确保指针
指向字符串文字、包含字符串的字符数组
或基本或指针类型的数组,其中至少有一个元素包含0
值,则是正确且合法的
但除此之外(如果指向的数组不包含至少一个0
值的元素),这是不合法的,因为由于指针的增加,您将访问具有该条件的数组边界以外的元素。要取消引用指向数组末尾的指针,请调用:
如果结果指向数组对象的最后一个元素后一个元素,则不应将其用作所计算的一元*
运算符的操作数
资料来源:ISO/IEC 9899:2011(C11),6.5.6/8
是的,你可以去。请注意,*指针
是指针
指向的内存位置的值(或保存的地址) “因为不确定数组末尾的0/NULL是否会停止该条件。”好吧,存在终止0不是自然规律。但如果您决定使用以0结尾的数组,则必须坚持使用该数组。然后由您来正确终止阵列。与使用带字符串函数的非终止字符数组相同。如果你做错了,它就会失败。如果您提供了错误的输入,任何其他检测数组结尾的机制都将以同样的方式失败。
#include <stdio.h>
int main( int argc, char * argv[] )
{
while ( *argv ) puts( *argv++ );
return 0;
}