分配适当的变量以使这些声明正确

时间:2017-06-28 22:16:00

标签: c function pointers function-pointers

我收到了以下代码:

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]++;
  1. FF函数返回一个指向3元素数组的指针,所以我们需要一个指向3元素数组的指针?
  2. 由于TAB[2]是第二个子阵列,那么只需一个指针即可吗?
  3. *NAP+1指向数组"a"中第一个单词的NAP字符的地址,所以我们需要一个指针来存储该地址?
  4. 这次*NAP[1]++实际上是指向一个值,所以只需要一个变量来完成工作吗?

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 的左值。一个不能将数组分配给变量,但是数组左值会衰减成指向第一个元素的指针,因此 数组会衰变成指向int的指针。好吧,你肯定知道如何声明一个指向int的指针,但我很懒,并且不想搞错,所以我只是把东西粘贴到e

cdecl

最后我们得到:

cdecl> declare e as pointer to int;
int *e;