13

可能重复: 字符指针和数组的堆栈指针差异

为了说明我的问题:

int main(void){
    int myary[20];
    int *myaryPtr;
    myaryPtr = myary;

    sizeof(myary); // Will it return 80? Correct?
    sizeof(myaryPtr); // Will it return 4? Correct?
    return 0;
}

首先,我的假设是否正确?

然后假设我的假设是正确的,详细解释是什么?我知道我的 20 元素数组是 80 字节,但名称不myary只是指向数组第一个元素的指针吗?那么它不应该也是4吗?

4

2 回答 2

13

是的,你的假设是正确的,假设一个int和一个指针在你的机器上都是 4 个字节长。

不,数组不是指针。数组名称有时会在某些上下文中衰减为指针,但它们不是一回事。comp.lang.c FAQ有一整节专门针对这个常见的混淆点。

于 2013-01-12T22:42:20.440 回答
3

在任何一种情况下,数组的大小都不会存储在内存中,无论您将其声明为int myArr[20]还是int* myArrPtr

发生的事情是sizeof()(由编译器)替换为常量 value

因此,由于myArr在编译之前指定了固定大小,编译器知道分配的内存量有多大。使用myArrPtr,您可以动态分配不同的数组大小,因此只存储类型的大小。

于 2013-01-12T22:55:06.407 回答