int *和int之间有什么区别

Case I: int a[12]; printf("%d",sizeof(a)); Case II: int *a = (int *)malloc(12*sizeof(int)); printf("%d",sizeof(a)); 

以上两个代码片段返回不同的输出,

  • 在第一种情况下为48
  • 在第二种情况下为4

为什么会这样?

因为数组不是指针,反之亦然。 期。

详细说明,如果是int a[12];a是一个数组,它拥有自己的属性。 它是类型数组 ,因此当您将数组名称传递给sizeof运算符时,它会为您提供数组的大小(在您的情况下,12 int s,乘以int的大小,4,总计48)。

OTOH, int *a = malloc(12*sizeof*a); (更正的格式), a是一个指针,并且在此上使用sizeof将只给出指针本身的大小,而不是指针指定的内存大小( 指向 )。

引用C-faq,第6章,

问:但我听说char a[]char *a相同?

答:完全没有。 (您所听到的与函数的forms参数有关)。 数组不是指针,尽管它们密切相关。

数组声明char a[6]请求留出六个字符的空格,以名称a 。 也就是说,有一个名为a的位置,可以坐6个字符。 另一方面,指针声明char *p请求保存指针的位置,由名称p知道。 这个指针几乎可以指向任何地方:任何char ,或任何连续的chars数组,或任何地方。

笔记:

  1. 请参阅此讨论,了解为什么不在Cmalloc()和family的返回值。 。
  2. 为了使代码健壮且可移植,首选使用变量名本身而不是分配语句中的硬编码数据类型。

数组和指针是C中不同的数据类型。当数组用作具有sizeof运算符的操作数时,它给出数组数据类型的大小。 但是,当指针与sizeof运算符一起使用时,返回指针的大小。

标准说(C11-6.5.3.4):

sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 大小由操作数的类型确定

第一种情况下的操作数a的类型是int [12]而第二种情况下的操作数的类型是int *

sizeof运算符处理类型的大小。 它不必对传递给它的操作数所持有的内容做任何事情

int a[12]作为int [12]类型,因此给出大小48(4*12)

int *a是一个整数指针, sizeof运算符给出指针的大小( 4 )。

在这些情况下, int a[12]int *a都不相同。 请注意, sizeof是少数几个不会衰减到指针的情况之一。

你得到了不同的答案,因为在这两种情况下, a是不同的。

int a[12]; – 在这个a是一个数组,

int *a = malloc(12*sizeof*a); – 在这个是一个指针。


在大多数地方,指针和数组可以互换使用,但这并不意味着它们是相同的东西。 两者都有不同的属性(如Sourav所解释)。