typedef struct student
{
char s_id[10];
char s_name[10];
char sex;
int age;
char addr[20];
double score;
int num;
}typedef;
这道题要问你都是这个score这个成员在这个结构体的第几个字节,其实也就是问这个score之前这个机构体有多少个字节。
这个题一看是可以看出来的,s_id十个字节,s_name十个字节,sex一个字节但是要和int类型的age对齐就成了四个字节,这个age不用说就是四个字节,addr二十个字节,这加一块10+10+4+4+20=48个字节,但现在要用个程序写出来,我第一时间还是有点懵的,但确实没有限制的话是可以写出来的,比如下面的。
student s;
int i = (int)(&s.score) - (int)&s;
printf("%d\n", i);
这里算出来的i就是前面的字节个数,我是用地址去考虑的,先创造出来这个结构体的一个对象,取地址,再把它强转成一个整数,这就有一个数字出来了,然后用这个成员标记到score这个成员里面,取地址,再强转成一个整形,因为对对象取地址是指向这个对象的头的,所以用成员的取地址转成的整数减去头这个地址就是score前面的字节个数了,这算下来就是48。
但是这里有了一个限制,不允许用对象,怎么来做?
int i = (int)((int)&((student*)0)->score);
printf("%d\n", i);
这个代码看的时候又懵了,这是个啥呀,来咱们一步一步分析一下这个代码,先是将0强转成student类型的指针,这一步的意义就在于这个指针的地址就是0,然后将它指向对象score然后再取地址,那这个时候猜一下,这个时候取得的地址1是什么,没有错就是将指针向后移动了48个字节,然后将他转成整形输出,答案48且没有用到对象,这个代码真的是可以的,直接将指针的地址变为0,然后顺便指向题上的成员,这个典型的无中生有,甚是精妙的呀,对于地址的运用,是目前我这个菜鸟的不能再菜鸟的程序员的一大弱点,但这个题给了我启发,地址不单单是用来操作一片空间,地址还能够用来计算距离大小,启发很大。