说明我的问题:
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?
答案 0 :(得分:11)
是的,你的假设是正确的,假设你的机器上有一个int
和一个4字节长的指针。
不,数组不是指针。数组名有时会在某些上下文中衰减为指针,但它们不是同一个东西。有一个whole section of the comp.lang.c FAQ致力于这个常见的混淆点。
答案 1 :(得分:3)
无论是将数组声明为int myArr[20]
还是int* myArrPtr
,数组的大小都不会存储在内存中。
会发生sizeof()
(由编译器)替换为常量值。
因此,因为在编译之前使用固定大小指定了myArr
,所以编译器知道分配的内存量有多大。使用myArrPtr
,您可以动态分配不同的数组大小,因此只存储类型的大小。