C 如何理解带指针的字符串
在过去的几个月里,我一直在学习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> 因此,在将该字符发送到输出后,指针将递增(++运算符
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
指向该数组的第一个元素。