C语言 结构体中的成员域偏移量

//C语言中结构体中的成员域偏移量
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct _student{
    char name[30];//32
    int num;
}Student;


void main(){
    Student *p = NULL;
    printf("%x\n", p);//打印 0
    p = p - 1;        
    printf("%x\n",p);//打印ffffdc
    //说明 指针的加法运算前面已有详述,p - 1移动了 sizeof(Student)个字节
    //由于结构体字节对齐原则,char name[30]数组占据32个字节,不是30个,不明白请看结构体那一章
    //计算出p的步长是 32+4=36

    p = p - 2;       
    printf("%x\n", p);//打印ffff94

    p = p + 2;       
    printf("%x\n", p);//打印ffffdc
    //说明:以上两个的解释同p-1

    p = (Student *)1;
    p = p - 1;
    printf("p - 1=%x\n", p);//打印ffffdd
    p = (Student *)1;
    p = p - p; 
    //警告:警告    1    warning C4047: “=”:“Student *”与“int”的间接级别不同  tec01.c    33    1    C005
    //警告产生原因是p-p得出的值是int型 p是Student *类型
    //由此说明:p - p和p-1有所区别,p-p只是单纯的p的值加减,p-p=0,返回值是int型,而p-1是指针间的运算,返回值是指针
    printf("p - p=%x\n", p);//打印0

    //结构体指针中 . ->操作符本质上是寻址,寻找每一个成员相对于结构体起始位置的内存偏移,
    //该操作在cpu里执行,不会操作内存,所以 p->num等价于  ((Student *)0)->num  因为不会操作内存,所以不会报错
    printf("%x\n", &(p->num));//打印20   (此处是16进制)
    //说明 &(p->num)是取p->num得地址   num相对于结构体起始位置的内存偏移量是char name[30]  32个字节(结构体字节对齐原则)
    system("pause");
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值