如果我有以下代码行:
int* a[3];
这是否意味着它是指向3个整数数组中第一个项的指针(因此,给它4个字节的大小)?或者它是否意味着它是一个由3个指针组成的数组(给它12个字节的大小)?
答案 0 :(得分:4)
array of pointers to int
编程语言中的C
数据类型。因此,此数组的每个元素都可以包含int
数据类型变量的地址。
int x=5, y=9, z=8;
int *a[3]; // Declare an array of pointers to int
a[0] = &x;
a[1] = &y;
a[2] = &z;
但是,如下所示的声明将声明指向array of 3 int
的指针。
int (*a)[3];
a
的大小取决于您将为其编译代码的平台。请使用sizeof
运算符来确定平台的大小。
int *a[3];
printf("Size of a: %zu\r\n", sizeof(a));
注意:强>
要打印sizeof运算符的结果,如果编译器支持C99,请使用%zu;否则,或者如果您想要最大的可移植性,打印size_t值的最佳方法是将其转换为unsigned long并使用%lu。您可以通过here了解相关信息。
答案 1 :(得分:1)
为了理解表达式和声明,您必须知道运算符优先级。网上有很多,例如here.
在该页面上,您可以看到尖括号的优先级高于解除引用星号,这意味着它们首先应用。如果您愿意,可以用括号括起部分声明,就像在表达式中一样:
int *(a[10]); // brackets are redundant and show operator precedence
因此,变量a
必须是数组。在应用解除引用运算符之后,索引生成的数组元素会产生int
,因此该元素必须是指向int的指针。
因此,声明声明了一个int指针数组。
作为额外的,你不能声明一个没有括号或typedef的数组的指针,只是因为运算符优先级是针对上面更常见的情况。指向数组的指针如下所示:
int (*a)[10]; // brackets are necessary to make "*" apply first
此处首先应用解除引用星号;因此a
必须是指针。结果类型可以被索引,因此必须是一个数组,其元素被声明为int
s。这使得a
成为int
s数组的指针。
答案 2 :(得分:0)
您可以使用以下代码自行测试:
#include <stdio.h>
int main()
{
int *a[3];
printf("%zu\n", sizeof(a));
return 0;
}
输出是12,在我正在测试它的机器上,显然你的问题也是3*sizeof(int)
。
Type declaration precedence将“数组”声明[]
放在“指向”声明(*
)上方一步,因此声明为:
Declare 'a' as an array of 3 pointers to type 'int'
您可以使用括号(()
)来更改处理类型声明的顺序:
int (*a)[3];
sizeof(a)
给它输出4,在你的机器上是指针的大小。
作为旁注,假设指针总是4个字节并且int
总是4个字节通常是不好的做法。这取决于架构,编译器,CPU模式等。