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

时间:2013-07-25 06:52:23

标签: c arrays pointers initialization

 int (*a)[5];

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

以下表达式是否正确?

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

4 个答案:

答案 0 :(得分:15)

假设您有一个长度为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 } };

答案 1 :(得分:4)

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

这一切都归结为您需要的阵列类型。根据目的,有多种方法可以在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;

答案 2 :(得分:1)

int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;

答案 3 :(得分:0)

int vals[] = {1, 2};
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;

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

(*arr)[0] = ...