c语言数组名到底是什么鬼?

数组名a不是存放a[0]的地址吗?它难道没有自己的空间吗?为什么它的地址跟它保存的地址值是同一个?一个空间可以存两个不同类型的值?

img

数组名只是个逻辑而已,它相当于一个集合,或者向电脑里的文件夹。文件才是实实在在的东西,文件夹只是表示里面有一堆文件。
因为数组是一个连续的空间,第一个数组元素的存储位置就是数组的起始地址,那么将数组名也定义为数组的起始地址,能够方便数组的访问。
比如说字符这个东西,物理上也是不存在的,只是一个逻辑而已。内存里存储的都是二进制数,将char类型的某个数值范围表达为字符而已

  • a 这里其实是 a + 0 ,在使用上 省略了 0,表示 数组首元素的地址,即a[0]的首地址;
  • &a 表示 数组的首地址, 它跟上面 的 a 和 &a[0] 都是 指向同一地址。

在C语言中,数组名代表了数组的起始地址,因此在大多数情况下,数组名会被解释为指向数组第一个元素的指针。数组名不是一个普通的变量,它并没有自己的存储空间,而是指向数组中第一个元素的指针。

由于数组名是指向数组首元素的指针,所以数组名的值等于数组首元素的地址。因此,数组名的地址和数组首元素的地址是相同的。例如,对于一个整型数组a,a的地址等于&a[0],也等于指向a的指针变量的地址。这是因为数组名是指向数组首元素的指针,所以它保存的是数组首元素的地址。

一个空间通常只能存储一种类型的数据。在C语言中,可以通过类型转换来改变数据类型,但是这样做可能会导致数据丢失或不准确。因此,如果要在同一段空间中存储不同类型的数据,一般需要使用联合体(union)或结构体(struct)等特殊的数据类型来实现。