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

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上编译它应该不是问题.

  • 出于好奇,你知道在哪里得到`cdecl`吗?Apple的资本主义猪并不足以为他们提供开发工具. (3认同)
  • @qrdl:还有一个cdecl在线版供公众使用:http://cdecl.org/ (2认同)

Mic*_*kis 7

您正在定义一个包含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)

我希望我能有所改善.


CB *_*ley 5

这是一个由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的数组.