Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
while(*指针)在C中合法吗?_C_Pointers_While Loop_Language Lawyer - Fatal编程技术网

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;
}