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

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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值