关于C语言&(*x)、数组指针等价性及指针算术的疑问
关于C语言数组下标与指针等价性的疑问解答
一、&*(a+i) = a+i的合法性与意义
- 你对
*x的理解存在偏差:*(a+i)不是单纯的“指针指向的数值”,它是左值——代表数组中第i个元素这个对象本身,而非临时复制出来的数值。比如int a[5];,a+i指向数组的第i个int元素,*(a+i)就是这个元素本身,完全可以对它取地址,这是C语言允许的操作。 - C语言语法规则明确:对一个左值进行解引用(
*)后再取地址(&),结果等价于原指针表达式。所以&*(a+i)直接等于a+i,这是语法层面的等价关系。 - 这段内容的核心意义:揭开数组下标语法的本质——
a[i]只是*(a+i)的语法糖。理解这点后,能彻底搞懂数组和指针的关联:比如数组名a可以隐式转换为指向首元素的指针,数组下标操作本质是指针的偏移和解引用;甚至3[a]这种看似奇怪的写法也是合法的(因为*(3+a)和*(a+3)等价)。
二、指针算术的偏移规则
是的,同类型指针x指向连续存储的第一个对象时,x+1的地址计算规则就是:x存储的首字节地址 + 1 * sizeof(对应类型)。
C语言的指针算术是类型感知的,会自动根据指针指向的类型大小计算偏移量,不需要手动计算字节数。比如int* x指向首元素(假设int占4字节),若x的地址是0x1000,则x+1的地址就是0x1004,直接指向第二个int元素,这是为了方便操作数组、结构体数组等连续存储对象设计的特性。
内容的提问来源于stack exchange,提问作者OldBeginnerNovice
相关产品推荐
相关产品推荐

