首页 > 解决方案 > 是否可以将文本字符串分配给指针?

问题描述

当我们这样做时:

char *p;
p="Hello stackoverflow";
printf("%s",p);

它会打印Hello stackoverflow,但根据我的理解,指针只能保存内存地址而不是文本字符串,为什么我们不应该取消引用指针printf("%s",*p);而不是p?couz only p 的意思是给我们指针保存的内存地址而不是内容!任何解释!谢谢。

标签: cpointersimplicit-conversionstring-literals

解决方案


表达式中使用的数组被隐式转换(极少数例外)为其第一个元素的指针。

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 ''array of type'' 的表达式将转换为类型为 ''pointer 的表达式键入指向数组对象的初始元素且不是左值的''。如果数组对象具有寄存器存储类,则行为未定义。

在此代码段中

char *p;
p="Hello stackoverflow";

字符文字"Hello stackoverflow"具有数组类型char[20]并用作初始值设定项,它被转换为指向其第一个元素的指针。其实写是一样的

p = &"Hello stackoverflow"[0];

至于取消引用表达式*p具有类型char但转换说明符%s需要类型的参数的指针 p char *

因此这个电话

printf("%s",*p);

调用未定义的行为。


推荐阅读