初始化“指向整数数组的指针”

int (*a)[5]; 

我们如何初始化一个指向上面显示的5个整数数组的指针。

以下表达式是否正确?

 int (*a)[3]={11,2,3,5,6}; 

假设你有一个长度为5的int数组,例如

 int x[5]; 

然后你可以做a = &x;

  int x[5] = {1}; int (*a)[5] = &x; 

要访问数组元素,你需要: (*a)[i] (== (*(&x))[i] == (*&x)[i] == x[i] )需要括号,因为[]运算符的优先级高于* 。 (一个常见的错误可能是*a[i]访问数组的元素)。

了解您提出的问题是编译时间错误:

 int (*a)[3] = {11, 2, 3, 5, 6}; 

它不正确且类型不匹配,因为{11,2,3,5,6}可以分配给int a[5]; 你分配给int (*a)[3]

另外,

你可以做一些像一维的事情:

 int *why = (int p[2]) {1,2}; 

同样,对于二维试试这个(感谢@caf ):

 int (*a)[5] = (int p[][5]){ { 1, 2, 3, 4, 5 } , { 6, 7, 8, 9, 10 } }; 

{11,2,3,5,6}是一个初始化列表 ,它不是一个数组,所以你不能指向它。 数组指针需要指向一个具有有效内存位置的数组。 如果数组是一个命名变量,或者只是一块已分配的内存并不重要。

这一切都归结为您需要的arrays类型。 有多种方法可以在C中声​​明数组,具体取决于目的:

 // plain array, fixed size, can be allocated in any scope int array[5] = {11,2,3,5,6}; int (*a)[5] = &array; // compound literal, fixed size, can be allocated in any scope int (*b)[5] = &(int[5]){11,2,3,5,6}; // dynamically allocated array, variable size possible int (*c)[n] = malloc( sizeof(int[n]) ); // variable-length array, variable size int n = 5; int vla[n]; memcpy( vla, something, sizeof(int[n]) ); // always initialized in run-time int (*d)[n] = &vla; 
 int a1[5] = {1, 2, 3, 4, 5}; int (*a)[5] = &a1; 
 int vals[] = {1, 2}; int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals; 

然后您访问数组的内容,如下所示:

 (*arr)[0] = ...