C指针和数组/'sizeof'运算符

时间:2013-01-12 22:40:11

标签: c arrays pointers sizeof

  

可能重复:   Stack pointer difference for char pointer and array

说明我的问题:

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?

2 个答案:

答案 0 :(得分:11)

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

不,数组不是指针。数组名有时会在某些上下文中衰减为指针,但它们不是同一个东西。有一个whole section of the comp.lang.c FAQ致力于这个常见的混淆点。

答案 1 :(得分:3)

无论是将数组声明为int myArr[20]还是int* myArrPtr,数组的大小都不会存储在内存中。

会发生sizeof()(由编译器)替换为常量值

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