此视频中的数字表明数组名称也占用了内存空间 https://youtu.be/HXF3XSmqB1M
答案 0 :(得分:5)
除了数组元素本身之外,没有为对象留出任何内存。如果您将数组声明为
T a[N]; // for any type T
那么你在内存中得到的是
+---+
a: | | a[0]
+---+
| | a[1]
+---+
...
+---+
| | a[N-1]
+---+
没有对象a
与a[0]
,a[1]
等分开。除非它是sizeof
或一元&
运算符的操作数,否则表达式 a
将从类型“ T
的N元素数组”的表达式转换(“衰减”)为“指向{{1}的指针”的表达式}”,表达式的值将是数组第一个元素的地址。 IOW,T
1 。
答案 1 :(得分:4)
否,数组名称不会“占用内存空间”。
我认为我不喜欢那个视频。也许只是我一个人,但是当我看到一个带有箭头的盒子指向另一个盒子时,它是一个指向某个地方的指针值。但是数组不是 not 指针。 (可能的讲师经常将数组名称描述为“常量指针”,或者绘制像该视频中那样令人误解的图片,并且使一代又一代的C语言学习者感到困惑,想象数组是指针,并想知道指针值的实际位置存储。)
这里有一些声明和一张可爱的ASCII艺术图片,显示了我想如何考虑数组和指针:
int i = 5;
int *ip = &i;
int a[10] = {11, 22, 33};
int *ip2 = a;
+-------+
ip: | * |
+---|---+
|
V
+-------+
i: | 5 |
+-------+
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
a: | 11 | 22 | 33 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
^
|
+---|---+
ip2: | * |
+-------+
在此图片中,方框是实际的存储器块(字节)。它们旁边的标签,例如i:
和a:
是符号。它们提供了内存中特定位置的名称,但是它们本身不会占用任何空间。
尤其是,数组名a
是存储数组内容的内存的第一个字节的位置的名称,就像名称i
是存储区的名称一样。变量值存储在内存中的第一个字节。
再次,数组名a
不会占用内存中的任何空间。尤其不是ip2
之类的东西。 ip2
是一个指针变量,它确实会占用内存空间,并且当前指向数组a
。
诀窍是-这确实是一个窍门,但每个C程序员都必须适应-在上述声明的基础上,我们可以同时编写a[2]
和ip2[2]
,这两个表达式都获取数组中的第三个值,即数字33。
另请参见旧版section 6中的C FAQ list,尤其是问题6.3和6.10。