为何数组中x+i=i赋值报错?*(x+i)与x+i赋值区别解析
问题解答
核心原因:赋值的左值必须是可修改的内存位置
C语言里,赋值语句左边的内容(左值)得是能被修改的内存实体——比如变量、数组元素、解引用后的指针。而x+i是个指针算术表达式,算出来的是一个临时的地址值,属于右值,只能被读取,不能被赋值。就像你不能写5=3一样,临时值没法作为左值接受赋值操作。
为什么*(x+i)能正常运行
x[i] = 2等价于*(x+i) = 2,这里的*(x+i)是对x+i这个地址做解引用操作,它代表的是该地址指向的内存空间,这是一个可修改的左值,所以可以接受赋值。直白点说:
x+i:只是计算出一个地址(比如0x1234),你不能把i的值塞给这个地址本身,地址是内存的固定标识,没法被修改。*(x+i):指的是这个地址对应的内存单元,你可以修改这个单元里存储的数据。
你的代码问题拆解
你写的x+i = i,本质是试图把i的值赋给一个临时计算出来的地址,这违反了C语言的赋值规则,编译器自然会报错。改成*(x+i) = i后,是把i的值写入到x+i指向的内存单元里,完全符合语法规则,所以能正常运行。
另外提醒下:你的循环条件i<11会导致数组越界,数组x只有10个元素(下标范围是0到9),当i=10时会访问超出数组范围的内存,可能导致程序崩溃或出现异常行为,建议改成i<10。
内容的提问来源于stack exchange,提问作者Jackob2001
相关产品推荐
相关产品推荐

