我收到了以下代码:
int TAB[4][6];
int (*FF(int k))[3];
char *NAP[]={"nap1", "nap2", "nap3"};
double T[][2]={{1.0,1.0},{0.},{2.0,3.0}};
我应该使这些声明正确(这样它们就不会在编译器中返回任何错误):
a = &T;
b = FF;
c = FF(9);
d = TAB[2];
e = FF(9)[1];
f = *NAP+1;
g = *NAP[1]++;
我只做了几件事。我的编译器(xCode)没有为这些返回任何错误,但我不知道如何声明剩下的3 ...
我设法做的事情:
1.int (*c)[3]= FF(9);
2.int *d = TAB[2];
3.char *f = *NAP+1;
4.char g = *NAP[1]++;
FF
函数返回一个指向3元素数组的指针,所以我们需要一个指向3元素数组的指针?TAB[2]
是第二个子阵列,那么只需一个指针即可吗?*NAP+1
指向数组"a"
中第一个单词的NAP
字符的地址,所以我们需要一个指针来存储该地址?*NAP[1]++
实际上是指向一个值,所以只需要一个变量来完成工作吗?答案 0 :(得分:4)
在这里,我将向您展示如何解决这些恼人的宣言难题,如专业人士:作弊。使用cdecl
程序,该程序也可以作为service找到。
例如:
cdecl> explain double T[][2];
declare T as array of array 2 of double
因此,声明double T[][2];
将T
声明为数组2的数组。如果您使用&
来获取某些的地址,则该地址的类型为指向的指针。因此,由于&T
的值已分配给a
,因此应将a
声明为指向 数组的 指针数组2的双:
cdecl> declare a as pointer to array of array 2 of double;
double (*a)[][2]
同样适用于FF
:
cdecl> explain int (*FF(int))[3];
declare FF as function (int) returning pointer to array 3 of int
所以FF
是一个功能。现在,要有一个变量可以分配它。函数的名称衰减到函数的指针 - 所以这里我们需要使用指针来运行:
cdecl> declare b as pointer to function (int) returning pointer to array 3 of int
int (*(*b)(int ))[3]
对于c
,因为FF
是一个函数(int),指向int 的数组3的指针,如果你用{{1}调用FF
(9)作为参数,它返回一个指向int 的数组3的指针:
int
对于cdecl> declare c as pointer to array 3 of int
int (*c)[3]
,我们使用索引运算符取消引用指针,因此我们得到一个类型数组为3 int 的左值。一个不能将数组分配给变量,但是数组左值会衰减成指向第一个元素的指针,因此e
:
cdecl
最后我们得到:
cdecl> declare e as pointer to int;
int *e;