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

为何C语言中array_at返回指针而非指针值?赋值合法性疑问

C语言左值与函数返回类型的差异解析

第一个代码的疑问解答

为什么array_at返回指针而非指针指向的值?

看array_at的函数定义:

int* array_at(Array *a,int index)
{
    return &(a->array[index]);
}

它的返回类型是int*(指向int的指针),函数里&(a->array[index])是取数组第index个元素的内存地址,所以返回的自然是指针(地址),而非元素的值。这种设计的目的是让调用者能直接操作数组内的元素——不管是读取还是修改。

为什么*array_at(&a,0)可作为左值赋值?

array_at(&a,0)返回的是数组第0个元素的地址,*是解引用运算符,作用是访问这个地址对应的内存空间。这个内存空间是malloc分配的有效可写内存,代表数组里实实在在的元素存储位置,属于左值(可以被赋值的对象),因此能放在赋值号左边。

两个代码的核心差异

第二个代码里的new函数:

int new(int i){
    i+=3;
    return i;
}

它的返回类型是int,返回的是一个临时数值(比如传入3时返回6)。这种临时值是右值,只能用来赋值给其他变量,本身不能被赋值——你没法给一个临时的数字6再赋值成4,这在C语言语法上是不允许的。

而第一个代码里的array_at返回指针(地址),解引用后指向的是一块可修改的内存区域,属于左值,所以能被赋值。


内容的提问来源于stack exchange,提问作者jim chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:01:07