C语言:指针类型强制性转换
标签:C语言 指针 强制性转换
by 小威威
1.引入
我们知道,每个变量都有对应的地址,地址的距离即为地址之差。然而,地址类型不同,也就不能进行减法运算。假如,我现在要求double类型的变量a与int类型的变量b之间地址的距离(以字节作为单位)那么,该怎样实现这一操作呢?
首先,我们知道,地址就是指针,指针就是地址,地址之差即为指针之差,因此不难想到,我们可以将指针转换成同一类型再进行减法运算。但是,需要注意的是,若要以字节作为距离的单位,就一定要定义char*类型。原因是:指针之差得到的数值不一定就是以字节为单位,而是与指针的数据类型有关,即数值 = 字节数/sizeof(数据类型)。所以,若把差值作为以字节为单位的距离时就要将地址强制性转化成char*类型。
2.实例
定义一个结构体类型T包含三个变量分别是double,char,和int类型。实例化一个T,输出此实例在内存中所占空间大小(使用sizeof),输出3个变量分别所占内存大小之和以及3个变量在内存中距离此实例的首地址的长度(以byte为单位)。
注意3个变量必须以double,char,int的顺序排列,比如:
struct T {
double x;
char y;
int z;
根据所输出内容理解struct在内存中的组织形式。
输出格式:实例所占内存大小以及3个变量所占内存大小之和在一行,以空格间隔;3个变量在内存中距离实例的首地址长度为一行,以空格间隔。
Hint:
struct在内存中存在自动对齐的功能,所以有些时候并不是其中的每个变量都是紧密排列的,会有一些内存空隙。
代码如下:
# include <stdio.h>
struct T {
double x;
char y;
int z;
};
int main(void) {
struct T st;
printf("%lu %lu\n", sizeof(st), sizeof(st.x)+sizeof(st.y)+sizeof(st.z));
printf("%ld %ld ", (char*)&st.x-(char*)&st, (char*)&st.y-(char*)&st);
printf("%ld\n", (char*)&st.z-(char*)&st);
return 0;
}