为何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
相关产品推荐
相关产品推荐

