"和 "."的真实情况-6ren"> "和 "."的真实情况-我一直想知道编译器如何看待指向结构的指针(假设在 C 中)和结构本身的真正区别是什么。 struct person p; struct person *pp; pp->age,我一直认为编译器会这样做-6ren">
gpt4 book ai didi

c - 关于 "->"和 "."的真实情况

转载 作者:太空狗 更新时间:2023-10-29 16:31:38 26 4
gpt4 key购买 nike

我一直想知道编译器如何看待指向结构的指针(假设在 C 中)和结构本身的真正区别是什么。

struct person p;
struct person *pp;

pp->age,我一直认为编译器会这样做:“结构中 pp 的值 + 属性“age”的偏移量”。

但是它对 person.p 做了什么?这几乎是一样的。对于我“程序员”来说,p 不是内存地址,它就像“结构本身”,但当然这不是编译器处理它的方式。

我的猜测是它更像是一个语法问题,编译器总是执行 (&p)->age

我是对的吗?

最佳答案

p->q 本质上是 (*p).q 的语法糖,因为它取消引用指针 p 然后转到其中的适当字段q。它节省了一个非常常见的情况(指向结构的指针)的输入。

本质上,-> 执行两个 引用(指针解引用、字段解引用),而 . 只执行一个(字段解引用)。

由于多重解引用因素,-> 不能被编译器完全替换为静态地址,并且总是至少包括地址计算(指针可以在运行时动态改变,因此位置也会改变),而在某些情况下,. 操作可以由编译器替换为访问固定地址(因为基结构的地址也可以固定)。

关于c - 关于 "->"和 "."的真实情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com