概述
gcc 编译器会根据指针类型对绝对地址做右移操作,返回就是实际的元素个数。
[root@vmtca-2003 test]# cat struct.c
#include <stdio.h>
#include <string.h>
typedef struct test
{
int a;
int b;
} TEST; (sizeof 8)
int main()
{
TEST a[10];
TEST * b= &(a[7]);
printf("index=%dn", b-&a[0]); /// 这里是7
return 0;
}
[root@vmtca-2003 test]# ./a.out
index=7
汇编
0000000000400596 <main>:
400596: 55 push %rbp
400597: 48 89 e5 mov %rsp,%rbp
40059a: 48 83 ec 60 sub $0x60,%rsp 分配0x60空间
40059e: 48 8d 45 a0 lea -0x60(%rbp),%rax 将这个地址放到rax
4005a2: 48 83 c0 38 add $0x38,%rax rax + 38,就是 b指向了 rbp+38 的位置。指向第7个元素
4005a6: 48 89 45 f8 mov %rax,-0x8(%rbp) 将
4005aa: 48 8d 45 a0 lea -0x60(%rbp),%rax
4005ae: 48 8b 55 f8 mov -0x8(%rbp),%rdx 指向第一个元素
4005b2: 48 29 c2 sub %rax,%rdx
4005b5: 48 89 d0 mov %rdx,%rax
4005b8: 48 c1 f8 03 sar $0x3,%rax //算术右移 sizeof的大小 2的3次方 8;
4005bc: 48 89 c6 mov %rax,%rsi
4005bf: bf 78 06 40 00 mov $0x400678,%edi
4005c4: b8 00 00 00 00 mov $0x0,%eax
4005c9: e8 d2 fe ff ff callq 4004a0 <printf@plt>
4005ce: b8 00 00 00 00 mov $0x0,%eax
4005d3: c9 leaveq
4005d4: c3 retq
4005d5: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
4005dc: 00 00 00
4005df: 90 nop
最后
以上就是沉默过客为你收集整理的c:结构体指针加减法的全部内容,希望文章能够帮你解决c:结构体指针加减法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复