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];
- 你首先看到cols [32]:这是一个大小为32的数组。
- 接下来你看到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上的原始文章。