之间有什么区别
int * a[10];
和
int (*b)[10];
我知道第一个是整数指针数组,但第二个是什么?如果我尝试分配
int (*c)[10] = a;
我到底在做什么?
答案 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)
int * a [10]是一个指针数组,即一个指针数组,可以容纳10个不同的整数存储器分配(空格),即
a[0] = (int *)calloc(10, sizeof(int));
a[1] = (int *)calloc(50, sizeof(int));
等等......通常a的大小为(10 * 4)=> 40。
int(* b)[10]是一个指向数组的指针,指向一个整数数组,即b指向大小为10的整数数组,即
b = &(integer array[10]);
以上内容可以在给定的例子中使用:
int c[10];
int (*b)[10];
b = &c;
使用指向数组的指针的优点是,根据代码的需要,可以在执行过程中不时更改数组。
答案 4 :(得分:1)
你应该这样做:
int d[10];
int (*c)[10] = d;
更多信息: