int (*a)[5];
我们如何初始化一个指向上面显示的 5 个整数数组的指针。
下面的表达是否正确?
int (*a)[3]={11,2,3,5,6};
int (*a)[5];
我们如何初始化一个指向上面显示的 5 个整数数组的指针。
下面的表达是否正确?
int (*a)[3]={11,2,3,5,6};
假设您有一个长度为 int 的数组,5
例如
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}
是一个初始化列表,它不是一个数组,所以你不能指向它。数组指针需要指向具有有效内存位置的数组。如果数组是一个命名变量或者只是一块分配的内存并不重要。
这一切都归结为您需要的数组类型。根据目的,在 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] = ...