首页 > 解决方案 > 数组名和指针的区别

问题描述

数组名称实际上就像键入数组第一个元素的地址吗?

基于我对数组名称的理解

数组名称变量不是具有自己的内存地址的指针,它的内容是数组第一个元素的地址

但这是一种以简单的英文名称输入第一个元素的地址的方法

我现在将尝试从视觉上解释它

考虑以下代码,它将与我将要向您展示的图像相关

char[] text = "Hey";
char *ptr = text;

现在看看图像

在此处输入图像描述

变量有它自己的*ptr内存地址,指针的内容是它的内存H地址0101

现在文本变量没有它自己的内存地址,当我们输入文本时 C 将它解释为内存地址0101

所以基本上文字是0101

我对吗 ?

标签: arrayscpointers

解决方案


好吧,几乎但不完全是。

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])。现在,由于数组是连续内存位置中相同对象(成员对象类型)的集合,因此数组的地址是数组的第一个元素的地址,所以在打印数组的地址和数组的第一个元素将是相同的 - 但请记住,它们的类型肯定不同。


推荐阅读