c - 是否可以将文本字符串分配给指针?
问题描述
当我们这样做时:
char *p;
p="Hello stackoverflow";
printf("%s",p);
它会打印Hello stackoverflow,但根据我的理解,指针只能保存内存地址而不是文本字符串,为什么我们不应该取消引用指针printf("%s",*p);
而不是p?couz only p 的意思是给我们指针保存的内存地址而不是内容!任何解释!谢谢。
解决方案
表达式中使用的数组被隐式转换(极少数例外)为其第一个元素的指针。
来自 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);
调用未定义的行为。
推荐阅读
- c# - MongoDb 是否有类似 EntityFramework 的“HasQueryFilter”?
- ffmpeg - 使用 FFMPEG 在 Raspberry Pi 4 上将 4K 视频文件流式传输到 YouTube
- python - 避免在 python 的子类中破坏 liskov 替换原则
- python - 将两个json文件合并为一个文件Python
- julia - 在 Julia 中实现涉及 if、else 和矩阵的函数的困难
- redis - 由于防火墙限制,Redis Db 连接失败
- vue.js - 为什么 beforeRouteUpdate 不更新路由
- django - 如何使用媒体 URL 将 Instagram 故事保存在我的媒体文件夹中?
- macos - 连接 AppleTV 后 Xcode 将继续运行
- arrays - 比较两个矩阵并在对应列中找到匹配的索引