int * array 是指向32个int的数组的指针,还是指向int的32个指针的数组? 有关系吗?

如果我写

int *columns[32]; 

我是否用32个指向int的指针定义了一个数组?
或者它是一个指向32个int的数组的指针?

我如何区分这两者? 有区别吗?

如有疑问 – 请询问cdecl

 $> cdecl Type `help' or `?' for help cdecl> explain int *columns[32] declare columns as array 32 of pointer to int 

编辑回复评论:我在Google Code Search上找到了cdecl源代码 。 它需要GNU readline库。 我认为在Mac OS X或Windows上编译它应该不是问题。

将评论扩展到另一个答案:

读取C声明有一个相当简单的过程。 从声明器中最左边的标识符开始,然后解决问题,记住*之前的[]()绑定。 鉴于声明

 int *columns[32]; 

打破它

  columns -- columns columns[32] -- is a 32-element array *columns[32] -- of pointers int *columns[32] -- to int. 

如果声明已经

 int (*columns)[32]; 

然后就会崩溃了

  columns -- columns (*columns) -- is a pointer (*columns)[32] -- to a 32-element array int (*columns)[32] -- of int. 

这也将帮助您构建复杂的声明。 假设您要声明一个指向函数的指针数组,这些函数返回指向char数组的指针:

  f -- f f[N] -- is an N-element array *f[N] -- of pointers (*f[N])() -- to functions *(*f[N])() -- returning pointers (*(*f[N])())[M] -- to M-element arrays *(*(*f[N])())[M] -- of pointers char *(*(*f[N])())[M]; -- to char 

cdecl是一个很好的工具,但是在你完成这个练习几次后,你不应该需要它。

您正在定义一个包含32个指针的数组。

要定义一个指向32个int数组的指针,您必须这样做

 int (*columns)[32]; 

前一个声明实例化一个空格为32 * sizeof(int)的数组。 另一方面,后者实例化一个未初始化的指针,然后您可以按如下方式使用它:

 int myintegers[32] = {0, 1, 2, ..., 31}; int (*columns)[32]; columns = &myintegers; printf("%d\n", (*columns)[2]); 

我希望我能有所改善。

它是一个由32个指向int的数组,是的,它确实很重要。

C语法规则指定数组访问( [] )比解除引用( * )和声明镜像使用更紧密。

声明int *columns[32]; 表示*columns[n] (其中n是介于0和31之间的数字)的表达式是int 。 该表达式与*(columns[n]) 。 声明为32个指针分配空间,但是没有分配int并且(假设这是一个函数本地声明)没有指针被初始化。

如果声明是int (*columns)[32]; 然后表达式(*columns)[n]将是一个int ,意味着* dereference在数组访问之前发生,因此列将是一个指向32 int s数组的指针。 声明将分配一个指针,但没有int的数组。

测试程序是说明性的,特别是对于我们这些非语言律师的人:

 $ gcc -xc - #include  int main(void) { int *columns[32]; printf("%lu\n%lu\n", sizeof(columns), sizeof(columns[0])); return 0; } $ ./a.out 128 4 $ 

它似乎是一个指针数组。

以下是一些有趣的声明:

 int *arrayOfIntP[32]; int (*pointerToArrayOf32)[32]; 

有关多维数组的更多乐趣,请查看以下post:

指向多维数组的指针数组

如何使用new声明二维数组?

一个技巧是从右到左阅读。

给定int * cols [32];

  1. 你首先看到cols [32]:这是一个大小为32的数组。
  2. 接下来你看到int *:这是一个指针

数组剩下的就是数组中元素的类型。 所以我们把它读作指向int(和计数32)的指针数组。

参考A’C’测试的问题#5 : Nigel Jones * 将要成为嵌入式程序员的0x10最佳问题 *


a)int a; //一个整数

b)int * a; //指向整数的指针

c)int ** a; //指向整数的指针

d)int a [10]; //一个包含10个整数的数组

e)int * a [10]; //一个包含10个整数指针的数组

f)int(* a)[10]; //指向10个整数数组的指针

g)int(* a)(int); //一个指向函数a的指针,它接受一个整数参数并返回一个整数

h)int(* a [10])(int); //一个包含10个指向函数的数组,这些函数接受一个整数参数并返回一个整数


*唉,在他们的网站上找不到embedded.com上的原始文章。