Sizeof数组和指针

这是我的示例代码

#include void main() { int arr[]={1,2,3,4,5,6}; char *ptr,a; a='c'; ptr=&a; int *ptr1,a1; a1=4; ptr1=&a1; printf("%d %d %d",sizeof(arr), sizeof(ptr1), sizeof(ptr)); } 

现在,据我所知,大小将告诉我存储变量所需的大小,现在这个的输出是

24 4 4

为什么arr=24的大小,毕竟它只是一个指针,它的大小应该是4?

谢谢。

“……毕竟它只是一个指针……”? 不。数组不是指针。 Array是一个数组对象:一个固定的连续内存块,用于存储数组元素,不涉及任何类型的指针。 在你的情况下,数组有6个元素,每个元素大小为4。 这就是为什么你的sizeof评估为24。

关于数组作为指针的常见误解已经被揭穿了数百万次,但不知怎的,它不时地继续出现。 阅读常见问题解答,如果您对此有任何疑问,请回来

http://c-faq.com/aryptr/index.html

PS正如@Joachim Pileborg在他的回答中正确指出的那样, sizeof不是一个函数。 这是一个运营商。


数组行为与指针不同的另一个上下文是一元&运算符(“地址”运算符)。 当unary &应用于int *类型的指针时,会产生int **类型的指针。 当unary &应用于int [10]类型的数组时,会生成int (*)[10]类型的指针int (*)[10] 。 这是两种非常不同的类型。

 int *p = 0; int a[10] = { 0 }; int **p1 = &p; /* OK */ int **p2 = &a; /* ERROR */ int (*p3)[10] = &a; /* OK */ 

它是另一个流行的问题(和错误)来源:有时人们期望&在应用于int [10]数组时产生一个int **指针。

当你有一个数组时, sizeof返回数组的大小(注意它是数组的字节大小,而不是数组中的项数),否则它返回类型或表达式的大小。

但是,如果将数组传递给函数,则数组会降级为指针并且大小信息将丢失。

另外,从技术上讲, sizeof不是一个函数,它是该语言中的一个特殊关键字,并且在与表达式一起使用时也可以在没有括号的情况下使用。

数组不会衰减到sizeof内的指针; sizeof(arr)返回为数组分配的总大小,在本例中为6 * sizeof(int)

来自维基百科

当sizeof应用于数组的名称时,结果是整个数组的大小(以字节为单位)。 (这是规则的少数例外之一,即数组名称转换为指向数组第一个元素的指针。)

sizeof()运算符没有给出数组中元素的数量,它给出了一个东西在内存中占用的字节数。 因此:

 #include  int main() { char s[] = { 1, 2, 3, 4, 5, 0 }; int xs[] = { 1, 2, 3, 4, 5, 0 }; printf( "sizeof( s ) = %d\n", sizeof( s ) ); printf( "sizeof( xs ) = %d\n", sizeof( xs ) ); return 0; } sizeof( s ) = 6 sizeof( xs ) = 24