arrays - 数组名和指针的区别
问题描述
数组名称实际上就像键入数组第一个元素的地址吗?
基于我对数组名称的理解
数组名称变量不是具有自己的内存地址的指针,它的内容是数组第一个元素的地址
但这是一种以简单的英文名称输入第一个元素的地址的方法
我现在将尝试从视觉上解释它
考虑以下代码,它将与我将要向您展示的图像相关
char[] text = "Hey";
char *ptr = text;
现在看看图像
变量有它自己的*ptr
内存地址,指针的内容是它的内存H
地址0101
现在文本变量没有它自己的内存地址,当我们输入文本时 C 将它解释为内存地址0101
所以基本上文字是0101
我对吗 ?
解决方案
好吧,几乎但不完全是。
text
是一个类型的变量char [4]
,它是一个 s 的数组char
。现在,根据规范,第 6.3.2.1/P3 章
除非它是运算
sizeof
符、运算符_Alignof
或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 ''array of type'' 的表达式将转换为类型为 '' 的表达式指向类型''的指针,它指向数组对象的初始元素,不是左值。如果数组对象具有寄存器存储类,则行为未定义。
这意味着,
char * ptr = text;
和写一样
char * ptr = &text[0];
也就是说,
现在文本变量没有它自己的内存地址,当我们输入文本时 C 将它解释为内存地址 0101
不,这是错误的。该变量text
有一个地址(尝试做&text
,它将是类型char (*) [4]
)。现在,由于数组是连续内存位置中相同对象(成员对象类型)的集合,因此数组的地址是数组的第一个元素的地址,所以在打印数组的地址和数组的第一个元素将是相同的 - 但请记住,它们的类型肯定不同。
推荐阅读
- scala - Akka 是否支持此状态更新 Actor 模式
- python - 使用 selenium 进行网页抓取但得到不同的文本
- typescript - VSCode 扩展:在文件资源管理器的右键菜单中添加自定义命令
- go - golang反射初始化满足接口的结构
- r - “terms.formula(公式,数据=数据)中的错误:'。' 在公式中,在老鼠的“with()”函数中没有“数据”参数”
- c# - 如何检查从数据库中检索到的当前日期时间是否在 c# 中已经过了午夜?
- python - 根据 Python 中 group_by 数据框中的先前值计算百分比
- python - Bot 无法识别消息在初始发送后约 5 秒后被删除(服务器消息删除)
- python - 如何在 Jupyter Notebook 中导入 Pyperclip?
- windows - 使用批处理文件确定网络共享映射到哪个驱动器号