C “初始化”;指向整数数组的指针;
如何初始化指向上面所示的5个整数数组的指针 下面的表达正确吗C “初始化”;指向整数数组的指针;,c,arrays,pointers,initialization,C,Arrays,Pointers,Initialization,如何初始化指向上面所示的5个整数数组的指针 下面的表达正确吗 int (*a)[5]; 假设您有一个长度5的int数组,例如 int (*a)[3]={11,2,3,5,6}; 然后你可以做a=&x int x[5]; 要访问数组元素,您需要:(*a)[i](=(*(&x))[i]=(*&x)[i]=x[i])括号,因为[]运算符的优先级高于*。(一个常见的错误是使用*a[i]访问数组元素) 了解您提出的问题是编译时间错误: int x[5] = {1}; int (*a)[5]
int (*a)[5];
假设您有一个长度
5
的int数组,例如
int (*a)[3]={11,2,3,5,6};
然后你可以做a=&x代码>
int x[5];
要访问数组元素,您需要:(*a)[i]
(=(*(&x))[i]
=(*&x)[i]
=x[i]
)括号,因为[]
运算符的优先级高于*
。(一个常见的错误是使用*a[i]
访问数组元素)
了解您提出的问题是编译时间错误:
int x[5] = {1};
int (*a)[5] = &x;
这是不正确的,而且类型也不匹配,因为{11,2,3,5,6}
可以分配给inta[5]代码>并且您正在分配给int(*a)[3]
另外,
您可以执行类似于一维的操作:
int (*a)[3] = {11, 2, 3, 5, 6};
同样,对于二维,请尝试以下方法(谢谢):
然后访问数组的内容,如中所示:
int vals[] = {1, 2};
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;
{11,2,3,5,6}
是初始值设定项列表,它不是数组,因此不能指向它。数组指针需要指向具有有效内存位置的数组。如果数组是一个命名变量,或者只是一块分配的内存,这并不重要
这一切归结为您需要的数组类型。在C中声明数组有多种方法,具体取决于用途:
int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;
在C语言中,“指向数组的指针”从来没有什么用处。它只是掩盖了代码,没有任何好处。只需声明并初始化数组,并使用指向其元素类型的指针。@LeedianelCrocker:那不是真的-指向数组的指针是动态分配多维数组的最有效方法(如int(*a)[5]=malloc(nrows*sizeof*a);
)是的,这很简单,但这只适用于在编译时知道内部维度的情况,而不适用于更一般的情况。@leedinelcrocker:对VLAs也适用:size\t cols。。。;int(*a)[cols]=malloc(nrows*sizeof*a)代码>。这也是2D数组表达式传递给函数时衰减的结果。OP的用法不正确,但这并不意味着它们没有用处。@Flow second not correct try,如int(*a)[5]=(int(*)[5])&({11,2,3,5,6})新编译器int(*a)[5]=(int[][5]){{1,2,3,4,5},{6,7,8,9,10}
@caf得到了它,这要感谢它与:int*why=(int[2]){1,2}
@caf得到了它!!我的注释表达式不正确,因为我以前使用了&
constant@caf你的表达式的确是c99
?@M.M。我不知道我为什么写这个。固定的。我想我是在警告不要在声明复合文字的范围外传递指向复合文字的指针。
int vals[] = {1, 2};
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;
(*arr)[0] = ...
int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;
// 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;