2017-01-21 113 views
2

如果我有下面的代码行:指针和用C存储器混乱

int* a[3]; 

是否意味着它是一个指向第一个项目中的3点的整数(因此阵列,给它一个尺寸的4字节)?或者它是否意味着它是一个3个指针的数组(给它一个12字节的大小)?

+1

将其插入到C声明 - >英文翻译器中:http://cdecl.org/ – user2357112

+0

它是一个由3个指向“int”的指针组成的数组:不管猜测大小,使用'sizeof a' 。 –

+1

为什么3个指针的数组是12个字节?什么保证一个指针是4个字节?为什么不使用'sizeof a'来检查呢?如果你想学习,那么重要的是变量'a'的类型,它的大小不容易预测。 –

回答

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;否则,或者如果您希望获得最大的可移植性,打印size_t值的最佳方法是将其转换为无符号长整型并使用%lu。你可以通过here阅读。

0

您可以用下面的代码测试这个自己:

#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模式等。

+0

对于'size_t'值,使用''%zu“',而不是''%d”'。 – aschepler

+0

@aschepler谢谢! –

1

为了理解表达式和声明,您必须知道运算符优先级。网上有很多,例如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的指针。