Car*_*ers 9 c arrays pointers multidimensional-array
如果我写
int *columns[32];
Run Code Online (Sandbox Code Playgroud)
我是否定义了一个包含32个ints 指针的数组?
或者它是一个指向32 ints 数组的指针?
我如何区分这两者?有区别吗?
Joh*_*ode 20
将评论扩展到另一个答案:
读取C声明有一个相当简单的过程.从声明器中最左边的标识符开始,然后解决问题[]并记住()之前绑定*.鉴于声明
int *columns[32];
Run Code Online (Sandbox Code Playgroud)
打破它
columns -- columns
columns[32] -- is a 32-element array
*columns[32] -- of pointers
int *columns[32] -- to int.
Run Code Online (Sandbox Code Playgroud)
如果声明已经
int (*columns)[32];
Run Code Online (Sandbox Code Playgroud)
然后就会崩溃
columns -- columns
(*columns) -- is a pointer
(*columns)[32] -- to a 32-element array
int (*columns)[32] -- of int.
Run Code Online (Sandbox Code Playgroud)
这也将帮助您构建复杂的声明.假设您要声明一个指向函数的指针数组,这些函数返回指向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
Run Code Online (Sandbox Code Playgroud)
cdecl是一个很好的工具,但是在你完成这个练习几次后,你不应该需要它.
qrd*_*rdl 16
如有疑问 - 请问 cdecl
$> cdecl
Type `help' or `?' for help
cdecl> explain int *columns[32]
declare columns as array 32 of pointer to int
Run Code Online (Sandbox Code Playgroud)
编辑回复评论:我在Google Code Search上找到了cdecl源代码.它需要GNU readline库.我认为在Mac OS X或Windows上编译它应该不是问题.
您正在定义一个包含32个指针的数组.
要定义指向32个int的数组的指针,您必须这样做
int (*columns)[32];
Run Code Online (Sandbox Code Playgroud)
前一个声明实例化一个空格为32*sizeof(int)的数组.另一方面,后者实例化一个未初始化的指针,然后您可以按如下方式使用它:
int myintegers[32] = {0, 1, 2, ..., 31};
int (*columns)[32];
columns = &myintegers;
printf("%d\n", (*columns)[2]);
Run Code Online (Sandbox Code Playgroud)
我希望我能有所改善.
这是一个由32个指针组成的数组,int是的,这很重要.
C语法规则指定数组access([])绑定比dereference(*)和声明镜像使用更紧密.
声明int *columns[32];意味着表达式*columns[n](其中n是0到31之间的数字)是一个int.这个表达式与*(columns[n]).声明为32个指针分配空间,但是没有int分配和(假设这是一个函数本地声明)没有指针被初始化.
如果声明已经int (*columns)[32];是表达(*columns)[n]将是一个int,意味着*取消引用发生在数组访问之前,所以列将是一个指向32 ints 数组的指针.声明将分配一个指针,但没有ints的数组.