我是靠谱客的博主 沉默过客,最近开发中收集的这篇文章主要介绍c:结构体指针加减法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

gcc 编译器会根据指针类型对绝对地址做右移操作,返回就是实际的元素个数。

[root@vmtca-2003 test]# cat struct.c
#include <stdio.h>
#include <string.h>

typedef struct test
{
        int a;
        int b;
} TEST;sizeof 8int 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:结构体指针加减法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部