繁体   English   中英

如何用指针理解字符串

[英]How to understand strings with pointers

最近几个月我一直在学习 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)在做什么。

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

因此, while循环中的表达式*p在每个循环开始时计算为p当前指向的char变量。 在循环内部, putchar调用也使用了这个解引用运算符,但随后会增加指针的值,因此,在将该字符发送到输出后,指针会增加( ++运算符),然后它指向字符串中的下一个字符。

传统上(实际上,几乎总是), C中的字符串是以NUL结尾的,这意味着字符串的结尾是通过在字符串末尾具有一个值为零的字符来表示的。

当代码中的while循环到达此NUL终止符时,表达式*p的值将因此为零。 而且,由于零相当于C的逻辑“假”(任何非零值都被视为“真”), 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。 结果的类型为 int。 对于任何一对操作数,只有一个关系为真。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM