在过去的几个月里我一直在学习C语言。我正在使用一本书,我有这样的练习:
char vector[N_STRINGS][20] = {"ola", "antonio", "susana"};
char (*ptr)[20] = vector;
char *p;
while(ptr-vector<N_STRINGS)
{
p = *ptr;
while(*p)
putchar(*p++);
putchar('\n');
ptr++;
}除了while(*p),我什么都能理解!我不知道while(*p)在做什么。
发布于 2019-12-25 03:35:40
代码中的变量p被定义为指向char的指针。要获取p所指向的实际char值,您需要使用*操作符取消对指针的引用。
因此,您的while循环中的表达式,*p在每个循环的开头计算为char变量,p是当前指向的变量。在循环中,putchar调用也使用这个解引用操作符,但随后会递增指针的值,因此,在将该字符发送到输出后,指针会递增( ++操作符),然后指向字符串中的下一个字符。
传统上(实际上,几乎总是如此),C中的字符串是NUL-terminated,这意味着字符串的结束是通过在字符串的末尾有一个值为零的字符来表示的。
当代码中的while循环到达这个NUL终止符时,表达式*p的值将为零。而且,由于零相当于C中的逻辑“假”(任何非零值都被认为是“真”),所以while循环将结束。
请随时要求进一步澄清和/或解释。
发布于 2019-12-25 03:38:47
来自C标准(6.8.5迭代语句)
4迭代语句导致称为循环体的语句重复执行,直到控制表达式比较等于0为止。
在程序的这一部分
p = *ptr;
while(*p)
//…指针p指向当前字符串的第一个字符。C中的字符串是以零字符'\0'结尾的字符序列。
例如,指针最初指向字符串"ola"的第一个字符。字符串在相应的字符数组中表示,如下所示
{ 'o', 'l', 'a', '\0' }循环中的条件
while(*p)可以重写为
while(*p != 0 )因此,将对字符串中除最后一个以零结尾的字符之外的所有字符执行循环,并输出字符串的前三个字符。
注意这一点(6.5.9相等运算符)
3 == (等于)和!= (不等于)运算符类似于关系运算符,只是它们的优先级较低。108)如果指定的关系为真,则每个运算符产生1,如果它为假,则产生0。结果为fi类型。对于任何一对操作数,只有一个关系是真的。
https://stackoverflow.com/questions/59472660
复制相似问题