您的位置:首页 > 编程语言 > C语言/C++

C语言:指针类型强制性转换

2015-12-17 20:35 423 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: