如果我有下面的代码行:指针和用C存储器混乱
int* a[3];
是否意味着它是一个指向第一个项目中的3点的整数(因此阵列,给它一个尺寸的4字节)?或者它是否意味着它是一个3个指针的数组(给它一个12字节的大小)?
如果我有下面的代码行:指针和用C存储器混乱
int* a[3];
是否意味着它是一个指向第一个项目中的3点的整数(因此阵列,给它一个尺寸的4字节)?或者它是否意味着它是一个3个指针的数组(给它一个12字节的大小)?
它是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;否则,或者如果您希望获得最大的可移植性,打印size_t值的最佳方法是将其转换为无符号长整型并使用%lu。你可以通过here阅读。
您可以用下面的代码测试这个自己:
#include <stdio.h>
int main()
{
int *a[3];
printf("%zu\n", sizeof(a));
return 0;
}
输出为12,其中,在机器上我测试它,显然也是你从你在你的问题中写道,是3*sizeof(int)
。
Type declaration precedence用C放“阵列”声明[]
一个步骤的“指针”以上声明(*
),所以声明为:
Declare 'a' as an array of 3 pointers to type 'int'
可以使用括号(()
)来更改顺序其中类型声明处理:
int (*a)[3];
sizeof(a)
给它的4的输出,其在计算机上是一个指针的大小。
作为一个方面说明,假设一个指针始终是4个字节,而且一个int
总是4个字节通常是不好的做法。这取决于架构,编译器,CPU模式等。
对于'size_t'值,使用''%zu“',而不是''%d”'。 – aschepler
@aschepler谢谢! –
为了理解表达式和声明,您必须知道运算符优先级。网上有很多,例如here.
在该页面上,您可以看到尖括号的优先级高于取消引用的星号,这意味着它们首先被应用。如果你喜欢你可以括号声明的部分用括号,就像在表达式:
int *(a[10]); // brackets are redundant and show operator precedence
因此,可变a
必须是一个数组。数组元素由于索引产生,在应用了解引用运算符后产生一个int
,因此该元素必须是指向int的指针。
因此,该声明声明了一个int指针数组。
作为一个额外的,你不能声明一个没有圆括号或typedefs的数组的指针,只是因为运算符优先级是针对上面更常见的情况而做的。指向数组的指针将如下所示:
int (*a)[10]; // brackets are necessary to make "*" apply first
这里,取消引用星号首先被应用;因此a
必须是一个指针。结果类型可以被索引,因此必须是一个数组,其元素声明为int
s。这使得a
成为指向数组int
的指针。
将其插入到C声明 - >英文翻译器中:http://cdecl.org/ – user2357112
它是一个由3个指向“int”的指针组成的数组:不管猜测大小,使用'sizeof a' 。 –
为什么3个指针的数组是12个字节?什么保证一个指针是4个字节?为什么不使用'sizeof a'来检查呢?如果你想学习,那么重要的是变量'a'的类型,它的大小不容易预测。 –