C 如何理解带指针的字符串

C 如何理解带指针的字符串,c,loops,pointers,while-loop,c-strings,C,Loops,Pointers,While Loop,C Strings,在过去的几个月里,我一直在学习C语言。我正在使用一本书,我做了以下练习: charvector[N_STRINGS][20]={“ola”、“antonio”、“susana”}; char(*ptr)[20]=向量; char*p; (ptr vector代码中的变量p被定义为指向char的指针。要获取p指向的实际char值,需要使用*运算符取消对指针的引用 因此,循环时,*p中的表达式在每个循环的开头计算char变量,该变量p当前指向g> 因此,在将该字符发送到输出后,指针将递增(++运算符

在过去的几个月里,我一直在学习C语言。我正在使用一本书,我做了以下练习:

charvector[N_STRINGS][20]={“ola”、“antonio”、“susana”};
char(*ptr)[20]=向量;
char*p;

(ptr vector代码中的变量
p
被定义为指向
char
的指针。要获取
p
指向的实际
char
值,需要使用
*
运算符取消对指针的引用

因此,
循环时,
*p
中的表达式在每个循环的开头计算
char
变量,该变量
p
当前指向g> 因此,在将该字符发送到输出后,指针将递增(
++
运算符),然后指向字符串中的下一个字符

按照惯例(事实上,几乎总是如此),
C
中的字符串以
NUL
结尾,这意味着字符串的结尾通过在字符串末尾具有值为零的字符来表示

当代码中的
while
循环到达此
NUL
终止符时,表达式
*p
的值将因此为零。并且,由于零相当于
C
中的逻辑“false”(任何非零值都被视为“true”),因此
while
循环将结束

请随时要求进一步澄清和/或解释。

来自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 为false。结果的类型为int。对于任何一对操作数,都是 其中一个关系是正确的


这称为指针解引用。它“返回”由
p
指向的内存地址处的值。稍后在while块中,您还可以使用
p++
语句增加
p
。基本上,您的代码遍历字符串并等待
NULL
终止。当(*p)执行循环体直到遇到前面提到的stringas@tilz0R的'\0'-末端时,您只需取消引用先前分配给char的指针*p,并在while循环括号内使用它作为检查。
while(*p)
while(*p!=0)
相同。
*p
什么时候等于零?或者,在字符串和字符的上下文中,
'\0'
?@machine\u 1取消引用“指向X的指针”会产生“X”,在这种情况下,X是一个20个字符的数组。所以
p=*ptr是正确的
*ptr
是一个20个字符的数组,因此数组指针衰减转换将应用,并且
p
指向该数组的第一个元素。