Sizeof数组和指针

2 c sizeof

这是我的示例代码

#include<stdio.h>
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));
}
Run Code Online (Sandbox Code Playgroud)

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

24 4 4

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

谢谢.

AnT*_*AnT 5

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

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

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

PS正如@Joachim Pileborg在答案中正确指出的那样,sizeof不是一个功能.这是一个运营商.


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

int *p = 0;
int a[10] = { 0 };

int **p1 = &p;      /* OK */
int **p2 = &a;      /* ERROR */
int (*p3)[10] = &a; /* OK */
Run Code Online (Sandbox Code Playgroud)

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