You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中能否将指针赋值给数组,或将返回指针的函数值赋给数组?

问题结论:不可直接将指针赋值给数组

首先明确:C语言中不支持直接把指针赋值给数组,核心原因如下:

  • 数组名属于不可修改的左值,它仅代表数组所在内存块的首地址,本身不具备可写的存储空间,不能出现在赋值运算符的左侧
  • 你测试代码里的q = *(int [3]) arrayReturn(z);写法存在两处错误:
    1. 数组名q不能作为赋值左值,语法层面直接不通过
    2. 无法将指针类型强制转换为数组类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:00:03