C中的数组是否需要单独的内存来存储第一个元素的地址?
Does arrays in C takes separate memory to store the address of the first element?
在许多 C 编程的教程视频和解释中,用于表示像这样的数组
int a[5] = {9,2,1,3,4};
Tutors/teachers 总是制作一个单独的框来存储数组第一个元素的地址,即在这种情况下为 9 的地址。
也就是说数组总共消耗的内存应该是(常量指针a存放首元素地址消耗的内存+5*(sizeof(int))
.
如果是这样,那么为什么下面提到的这个程序会给出这样的输出。
计划
#include <stdio.h>
int main()
{
int a[5] = {6,1,2,9,3};
int * p = a;
printf("a is %u\n", a);
printf("&a is %u\n", &a);
printf("&a+1 is %u\n", &a+1);
printf("p is %u\n", p);
printf("&p is %u", &p);
return 0;
}
输出
a is 2128206832
&a is 2128206832
&a+1 is 2128206852
p is 2128206832
&p is 2128206824
这里a
和&a
给出了相同的地址。
当查看人们主要用来表示 C 中的数组的表示时,情况根本不应该是这样。
根据他们的数组图表示,它应该给 a
和 &a
不同的值,就像 p
和 &p
一样。
那么数组在内存中是如何真正表示的呢?
很抱歉这么小的疑问,但我很困惑。
a
是否创建一个单独的内存space来存储数组第一个元素的地址?
- 如果是那么为什么
a
和 &a
给出相同的值?
- 它应该像
p
和 &p
一样不同。
不,a并没有创建单独的内存来存储数组的地址。 &a
给出数组地址,a给出a[0]
地址。 &a 和 a 都是相同的 a,因为第一个元素的地址与数组的地址相同。 int a[5]
完全符合它的样子,生成 5 个元素的数组。创建 p 时,您创建了一个单独的变量,该变量的值为 &a[0]
。您可以对此进行更清楚的了解。你还应该看看 this
在许多 C 编程的教程视频和解释中,用于表示像这样的数组
int a[5] = {9,2,1,3,4};
Tutors/teachers 总是制作一个单独的框来存储数组第一个元素的地址,即在这种情况下为 9 的地址。
也就是说数组总共消耗的内存应该是(常量指针a存放首元素地址消耗的内存+5*(sizeof(int))
.
如果是这样,那么为什么下面提到的这个程序会给出这样的输出。
计划
#include <stdio.h>
int main()
{
int a[5] = {6,1,2,9,3};
int * p = a;
printf("a is %u\n", a);
printf("&a is %u\n", &a);
printf("&a+1 is %u\n", &a+1);
printf("p is %u\n", p);
printf("&p is %u", &p);
return 0;
}
输出
a is 2128206832
&a is 2128206832
&a+1 is 2128206852
p is 2128206832
&p is 2128206824
这里a
和&a
给出了相同的地址。
当查看人们主要用来表示 C 中的数组的表示时,情况根本不应该是这样。
根据他们的数组图表示,它应该给 a
和 &a
不同的值,就像 p
和 &p
一样。
那么数组在内存中是如何真正表示的呢?
很抱歉这么小的疑问,但我很困惑。
a
是否创建一个单独的内存space来存储数组第一个元素的地址?- 如果是那么为什么
a
和&a
给出相同的值? - 它应该像
p
和&p
一样不同。
不,a并没有创建单独的内存来存储数组的地址。 &a
给出数组地址,a给出a[0]
地址。 &a 和 a 都是相同的 a,因为第一个元素的地址与数组的地址相同。 int a[5]
完全符合它的样子,生成 5 个元素的数组。创建 p 时,您创建了一个单独的变量,该变量的值为 &a[0]
。您可以对此进行更清楚的了解。你还应该看看 this