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

时间:2009-09-03 07:27:09

标签: c arrays pointers multidimensional-array

如果我写

int *columns[32];

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

数组的指针

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

8 个答案:

答案 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];

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

Array of pointers to multidimensional arrays

How do I declare a 2d array using new?

答案 6 :(得分:0)

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

给定int * cols [32];

  1. 您首先看到cols [32]:这是一个大小为32的数组。
  2. 接下来你看到int *:这是一个指针
  3. 数组左边的所有内容都是数组中元素的类型。所以我们把它读作指向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个指向函数的数组,这些函数接受一个整数参数并返回一个整数


*唉,嵌入式网站上的原始文章已无法在其网站上找到。