C语言中能否将指针赋值给数组,或将返回指针的函数值赋给数组?
问题结论:不可直接将指针赋值给数组
首先明确:C语言中不支持直接把指针赋值给数组,核心原因如下:
- 数组名属于不可修改的左值,它仅代表数组所在内存块的首地址,本身不具备可写的存储空间,不能出现在赋值运算符的左侧
- 你测试代码里的
q = *(int [3]) arrayReturn(z);写法存在两处错误:- 数组名q不能作为赋值左值,语法层面直接不通过
- 无法将指针类型强制转换为数组类型
int[3],不符合C语言的类型转换规则
正确实现方案
你要实现的需求本质是「把函数返回指针指向的内容拷贝到自定义数组中」,可通过以下两种方式实现,执行后q仍为数组类型,符合你的使用要求:
方法1:逐个元素拷贝
适合小数组,逻辑直观:
#include <stdio.h> int * arrayReturn(int *q){ // 示例函数 return q; } int main() { int z[3] = { 1 , 2 , 3}; int q[3]; int *res = arrayReturn(z); for(int i = 0; i < 3; i++){ q[i] = res[i]; } printf("%d %d %d", q[0],q[1], q[2]); return 0; }
方法2:使用memcpy批量拷贝
适合大数组,执行效率更高:
#include <stdio.h> #include <string.h> int * arrayReturn(int *q){ // 示例函数 return q; } int main() { int z[3] = { 1 , 2 , 3}; int q[3]; memcpy(q, arrayReturn(z), sizeof(q)); printf("%d %d %d", q[0],q[1], q[2]); return 0; }
你第二段可用代码的原理说明
你写的int (*c)[3] = (int(*)[3])arrayReturn(z);中,c的类型是指向长度为3的int数组的指针,本身属于指针变量而非数组,指针是可修改的左值,所以可以被赋值。此时c指向z数组的首地址,c[0][x]等价于(*c)[x]也就是z[x],所以可以正常输出值,但c确实不是数组类型。
内容的提问来源于stack exchange,提问作者elections 12
相关产品推荐
相关产品推荐

