使用额外指针在堆栈上分配的C数组

使用额外指针在堆栈上分配的C数组,c,arrays,C,Arrays,我是C新手,但对编译器以及堆栈框架的工作原理等有相当好的理解。我试图理解C数组是如何在堆栈上分配的,同时也是指针。例如,以代码为例: int a = 101; int b[5] = {1, 2, 3, 4, 5}; 我听说b是这里的指针。e、 g.*(b+1)=3;'与“b[2]=3”相同。这是否意味着这里的堆栈帧有一个a的整数、一个b的指针和一个由b指向的数组(5*sizeof(int)字节)(我称这种情况为a),或者只有一个a的整数和一个b的数组(我称这种情况为b) 我创建了一张图片,让这

我是C新手,但对编译器以及堆栈框架的工作原理等有相当好的理解。我试图理解C数组是如何在堆栈上分配的,同时也是指针。例如,以代码为例:

int a = 101;
int b[5] = {1, 2, 3, 4, 5};
我听说b是这里的指针。e、 g.*(b+1)=3;'与“b[2]=3”相同。这是否意味着这里的堆栈帧有一个a的整数、一个b的指针和一个由b指向的数组(5*sizeof(int)字节)(我称这种情况为a),或者只有一个a的整数和一个b的数组(我称这种情况为b)

我创建了一张图片,让这一点更加清晰:


如果情况A是真的,为什么C设计人员选择实现数组与变量如此不同?这难道不意味着数组需要不断地进行额外的内存查找才能获取指针的地址吗?

C没有堆栈的概念。使用正确的术语,我们可以说

intb[5]={1,2,3,4,5}

具有自动存储持续时间

恰好,数组索引完全等同于取消对指针的引用,并且指针算法在数组中是有效的

所以
b[2]
*(b+2)
是等价的。C的设计者这样做是为了清晰

“堆栈”上发生的事情是实现选择,而不是语言选择

a
b
之间的关系不是特别相关。请注意,您无法通过对
b
进行一些奇怪的索引来“访问”
a
(反之亦然)。尝试这样做的行为尚未定义

这是否意味着这里的堆栈帧有a的整数、b的指针和b指向的数组(5*sizeof(int)字节)

您的
b
是一个数组,而不是指针。所以
b
是一个内存块,包含五个连续的整数

如果您声明了一个额外的指针

int *c = b;

那么这将类似于您在情况B中所描述的,即您有一个指向数组开头的指针。

首先,
*(B+1)=2(不是3)C不强制执行对象的特定分配方案。它既不需要堆,也不需要堆栈。问题太广泛了。另外:数组不是指针!不管是谁告诉你应该在教之前先学这门语言,数组都会变成指针。它们本身并不是指针,主要发生的是情况B,但这是一个实现细节,编译器可以使用不同的布局。我从未见过这样的情况,绝对没有理由实现这样的阵列。
int *c = b;