C中的数组语法

时间:2011-10-31 04:31:22

标签: c arrays

之间有什么区别

int * a[10];

int (*b)[10];

我知道第一个是整数指针数组,但第二个是什么?如果我尝试分配

int (*c)[10] = a;

我到底在做什么?

5 个答案:

答案 0 :(得分:10)

查看是否可以为系统安装cdecl命令。 (在Ubuntu上,sudo apt-get install cdecl。)cdecl.org还有一个网络界面。

这是我告诉我的系统示例:

$ cdecl
Type `help' or `?' for help
cdecl> explain int * a[10];
declare a as array 10 of pointer to int
cdecl> explain int (*b)[10];
declare b as pointer to array 10 of int
cdecl> 

答案 1 :(得分:5)

第二个是指向10个整数数组的指针。哪里?天知道;你从来没有初始化它。

如果你为它指定a,你就会指向a所指向的10个整数的相同数组......没什么特别的。

答案 2 :(得分:5)

我曾经学过很多关于阅读真正困扰我的声明的花哨技巧(也许这不是正确的词):http://www.antlr.org/wiki/display/CS652/How+To+Read+C+Declarations

  

从变量名称开始(如果没有标识符,则从最内层构造开始)   当下。向右看而不跳过右括号;说什么   你看。再看左边而不跳过括号;说什么   你看。如果有的话,跳出一个括号级别。向右看;说什么   你看。看左边;说出你所看到的。以这种方式继续,直到   你说变量类型或返回类型。

使用该算法,您可以轻松阅读和理解任何C变量声明。

有时,当它们变得非常复杂时,使用这个小实用程序很好:cdecl可作为独立应用程序使用,也可作为网站使用:http://cdecl.org/

答案 3 :(得分:2)

  1. int * a [10]是一个指针数组,即一个指针数组,可以容纳10个不同的整数存储器分配(空格),即

    a[0] = (int *)calloc(10, sizeof(int));
    a[1] = (int *)calloc(50, sizeof(int));
    

    等等......通常a的大小为(10 * 4)=> 40。

  2. int(* b)[10]是一个指向数组的指针,指向一个整数数组,即b指向大小为10的整数数组,即

    b = &(integer array[10]);
    

    以上内容可以在给定的例子中使用:

    int c[10];
    int (*b)[10];
    b = &c;
    

    使用指向数组的指针的优点是,根据代码的需要,可以在执行过程中不时更改数组。

答案 4 :(得分:1)

  1. 第一个是指向10个整数的指针数组。
  2. 第二个是指向包含五个整数的数组的一个指针。
  3. 最后一个是初始化一个指针指向a,这是一个指向10个整数的指针数组,而不是10个整数的数组,所以要小心。
  4. 你应该这样做:

    int d[10];
    int (*c)[10] = d;
    

    更多信息:

    C pointer to array/array of pointers disambiguation