事后诸葛亮之a->b和 a.b 区别

作者: 大兵布莱恩特 | 来源:发表于2019-03-25 23:27 被阅读156次

今天去面试 面试官问我 a->b 跟 a.b有啥区别,我说第一个是通过指针去访问成员,第二个是点语法去访问 ,一般用在结构体变量去访问其内部成员b 是通过指针偏移去查找的

typedef struct Student {
int age;
char *name;
}

Student *st1;
Student *st2;

变量名只是结构体首元素的地址
st1->age 是指针从0位置 取出4个字节 就是 age 的内存地址(int类型 4个字节)
st1->name 是指针跳过前4个字节 取出 name 所在的4个字节的内存

st1.age 是指针从0位置 取出4个字节 就是 age 的内存地址(int类型 4个字节)
st1.name 是指针跳过前4个字节 取出 name 所在的4个字节的内存

当时回答的是通过a->b ,a.b是两种不同的访问方式 属于编译器语法,访问结构体内部成员本质就是通过首地址偏移去访问内部成员.
下边通过汇编代码来解释a->b 和 a.b 的区别

IMG_2943.PNG

mov dword ptr [ebp-8] , eax 从 eax( *st 所指向内存) 寄存器里取出4个字节 存放到 ebp-8里边

IMG_2944.PNG

mov dword ptr [ebp-0Ch] , eax 从eax寄存器重取出4个字节数据 放到 ebp-0Ch里边

从汇编代码可要看出来 a->b ,a.b 没有本质区别 都是从内存里取出4个字节的数据 ,找到 b 所在内存

如果要通过st->name 汇编代码又是怎么样子呢?

IMG_2944.PNG

 mov         dword ptr [ebp-10h],eax     ==> st1->age
 mov         dword ptr [ebp-0Ch],eax  ==> st1->name

[ebp-10h] st1->age的地址值 十进制16对应的是十六进制 10 所以这里是ebp-10h
[ebp-0Ch] st1->name的地址值 十进制12对应对应十六进制C 所以这里是ebp-0Ch

可以看出来 从st1->name 到st1->age 是相差4个字节的,所以结构体访问其成员变量就是通过指针地址偏移完成的

从汇编上看a->b 和 a.b 本质是一样的 都是通过eax取出4个字节 放到一个内存地址里 这个内存地址 根据在结构体里成员属性的位置而不同

相关文章

  • 事后诸葛亮之a->b和 a.b 区别

    今天去面试 面试官问我 a->b 跟 a.b有啥区别,我说第一个是通过指针去访问成员,第二个是点语法去访问 ,一般...

  • 就是A.B和C吧

    我想养一只猫。一直棕灰色毛发的猫。它的眼睛是土色的,圆圆的,褐色的瞳孔几乎占据了整个眼球。 早上,它会跳到我的脸上...

  • 在react当中 箭头函数和普通函数的区别

    最近在做项目中遇到一个问题:onclick = {a.b} 会导致找不到a.b方法的内部的this丢失 1.导致我...

  • 多类选择器class = “a b”

    .a.b{color:red};//这种写法只能是 a和b在同一个class下时 Hello World

  • 对象

    // 对象就是拥有一组属性和方法的集合 // 如果 a.b ,那么a就是对象,b是a的属性 //...

  • 向量基本操作

    向量加法:c = a + b 向量减法:c = a - b 距离(a,b)= 向量点乘 a.b = a1b1 +...

  • Python中from...import 与import...a

    from...import from A import b,相当于 import A b = A.b 此过程中有一...

  • BeautifulSoup基础

    代码示例一a = The Dormouse's story a.p = []a.b = The Dormo...

  • 内部类和静态内部类的区别

    内部类:1、内部类中的变量和方法不能声明为静态的。2、内部类实例化:B是A的内部类,实例化B:A.B b = ne...

  • 2020-10-05

    逻辑运算定律交换律:A+B = B+A A.B = B.A分配律:A(B+C) = AB+AC (A+...

网友评论

    本文标题:事后诸葛亮之a->b和 a.b 区别

    本文链接:https://www.haomeiwen.com/subject/sruivqtx.html