如果我写
int *columns[32];
我是否定义了一个包含32个指向int
的指针的数组?
或者它是一个指向32 int
s?
我如何区分这两者?有区别吗?
答案 0 :(得分:20)
将评论扩展到另一个答案:
读取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是一个不错的工具,但是在你完成这个练习几次后,你不应该需要它。
答案 1 :(得分:16)
如有疑问 - 请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上编译它应该不是问题。
答案 2 :(得分:7)
您正在定义一个包含32个指针的数组。
要定义一个指向32个整数数组的指针,你必须这样做
int (*columns)[32];
前一个声明实例化一个空格为32 * sizeof(int)的数组。另一方面,后者实例化一个未初始化的指针,然后您可以按如下方式使用它:
int myintegers[32] = {0, 1, 2, ..., 31};
int (*columns)[32];
columns = &myintegers;
printf("%d\n", (*columns)[2]);
我希望我能有所改善。
答案 3 :(得分:5)
这是一个包含int
的32个指针的数组,是的,这很重要。
C语法规则指定数组访问([]
)比解除引用(*
)和声明镜像使用更紧密。
声明int *columns[32];
表示表达式*columns[n]
(其中n
是0到31之间的数字)是int
。此表达式与*(columns[n])
相同。声明为32个指针分配空间,但没有分配int
并且(假设这是一个函数本地声明)没有指针被初始化。
如果声明为int (*columns)[32];
,则表达式(*columns)[n]
将为int
,这意味着*
取消引用会在数组访问之前发生,因此列将是指向32 int
s数组的指针。声明将分配一个指针,但没有int
s。
答案 4 :(得分:0)
测试程序是说明性的,特别是对于我们这些不是语言律师的人:
$ gcc -x c -
#include <stdio.h>
int main(void)
{
int *columns[32];
printf("%lu\n%lu\n", sizeof(columns), sizeof(columns[0]));
return 0;
}
$ ./a.out
128
4
$
它似乎是一个指针数组。
答案 5 :(得分:0)
以下是一些有趣的声明:
int *arrayOfIntP[32];
int (*pointerToArrayOf32)[32];
有关多维数组的更多乐趣,请查看以下帖子:
答案 6 :(得分:0)
一个技巧是从右到左阅读。
给定int * cols [32];
数组左边的所有内容都是数组中元素的类型。所以我们把它读作指向int(和计数32)的指针数组。
答案 7 :(得分:0)
参见Nigel Jones *的A 'C' Test: The 0x10 Best Questions for Would-be Embedded Programmers 问题#5
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个指向函数的数组,这些函数接受一个整数参数并返回一个整数
*唉,嵌入式网站上的原始文章已无法在其网站上找到。