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
数组,或任何地方。
笔记:
- 请参阅此讨论,了解为什么不在
C
中malloc()
和family的返回值。 。 - 为了使代码健壮且可移植,首选使用变量名本身而不是分配语句中的硬编码数据类型。
数组和指针是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所解释)。