指向数组指针

我有一个int指针数组int* arr[MAX]; 我想将其地址存储在另一个变量中。 如何定义指针数组的指针? 即:

 int* arr[MAX]; int (what here?) val = &arr; 

应该只是:

 int* array[SIZE]; int** val = array; 

由于数组在赋值运算符的右侧衰减为隐式指针,因此无需在array上使用地址运算符。

正确答案是:

 int* arr[MAX]; int* (*pArr)[MAX] = &arr; 

要不就:

  int* arr [MAX]; typedef int* arr_t[MAX]; arr_t* pArr = &arr; 

最后一部分读作“pArr是指向int的类型指针的MAX元素数组的指针”。

在C中,数组的大小存储在类型中,而不是存储在值中。 如果你想让这个指针正确地处理数组上的指针运算 (如果你想用它们制作一个二维数组并使用这个指针迭代它), 你 – 通常不幸的是 – 需要有数组嵌入指针类型的大小。

幸运的是,既然C99和VLA(甚至可能早于C99?)MAX可以在运行时指定,而不是编译时。

IIRC,数组可以隐式转换为指针,因此它将是:

 int ** val = arr; 

据我所知, c没有特定类型的“整数数组”,因此不可能有一个指向它的特定指针。 你唯一能做的就是使用指向int: int*的指针,但你应该考虑int的大小和你的数组长度。

根据这个来源http://unixwiz.net/techtips/reading-cdecl.html ,通过使用“当你可以走的时候,在你必须的时候离开”规则,我们得到以下2个含义的声明以前的答案 –

 int **val ==> val is a pointer to pointer to int int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int. 

我希望上述含义是有意义的,如果他们不这样做,那么仔细阅读上述来源可能是个好主意。

现在应该清楚的是,第二个声明是moteutsch正在寻找的声明,因为它声明了指向指针数组的指针。

那么为什么第一个也有效呢? 记住这一点

 int* arr[MAX] 

是一个整数指针数组。 因此,val是一个指针,指向在int指针数组中声明的第一个int。

我相信答案很简单:

 int **val;
val = arr;