c - 如何用指针理解字符串
问题描述
过去几个月我一直在学习 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
. 获取指向的实际 char
值p
,您需要使用运算符取消引用指针*
。
因此,循环中的表达式在while
每个*p
循环开始时计算当前指向的char
变量。在循环内部,调用也使用此取消引用运算符,但随后会递增指针的值,因此,在将该字符发送到输出后,指针会递增(运算符),然后指向字符串中的下一个字符。p
putchar
++
按照惯例(事实上,几乎总是),in 中的字符串C
是NUL
- 终止的,这意味着字符串的结尾是通过在字符串末尾有一个值为 0 的字符来表示的。
当while
您的代码中的循环到达此NUL
终止符时,表达式的值*p
将因此为零。并且,由于 ZERO 等价于逻辑“假” C
(任何非零值都被视为“真”),while
循环将结束。
随时要求进一步澄清和/或解释。
推荐阅读
- c# - 无效的令牌/当前上下文中不存在
- php - 通过自定义批量操作处理程序更新时将订单状态更改为已确认而不发送确认电子邮件
- linux - 使用“sed 命令”在多输出文件中以“F serve..”开头的打印行
- c# - Unity 使用 OnPreRender()、OnPostRender() 仅渲染 1 个主摄像机的阴影
- javascript - 无法在日历中显示事件
- c# - 同时将元数据存储到远程服务器和本地数据库,哪个应该是第一个?
- google-analytics - 收到错误 - 缺少 google_app_id,Firebase Analytics 已禁用
- azure - 如何在 azure app 洞察中保存一些自定义 qna 制造商数据?
- symfony - Symfony 注解路由顺序
- embedded-resource - “如何嵌入资源”或“如何访问资源”