C++指针的强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:

(类型说明符) (表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。

指针类型简介

c语言中,指针是就是内存地址,因此使用指针可以方便的操作内存数据。指针的类型标志着这个指针指向数据的类型,有两个作用:

1、告诉了编译器需要从这个地址开始对**多少字节(n)**的数据进行操作, 以及操作模式
2、告诉编译器当对这个指针进行增减操作时,每加(减)一对应实际内存地址改变的字节数(n)

char* pointer1				//该指针指向从该地址开始一个1字节的内容
short int* pointer2;		//该指针指向从该地址开始一个2字节的内容
long int* pointer3;			//该指针指向从该地址开始一个4字节的内容
long long int* ponter4;		//该指针指向从该地址开始一个8字节的内容

pointer1++ 使其对应内存地址移动一个字节
pointer2++ 使其对应内存地址移动两个字节
pointer3++ 使其对应内存地址移动三个字节
pointer4++ 使其对应内存地址移动四个字节

指针的强制类型转换

指针类型的强制类型转换就是重新告诉编译器:

1、需要从这个地址开始对**多少字节(n)**的数据进行操作, 以及操作模式
2、对这个指针进行增减操作时,每加(减)一对应实际地址内存移动的字节数(n)
你比如说

long int* pointer3;			//该指针指向从该地址开始一个4字节的内容
char* pointer1				//该指针指向从该地址开始一个1字节的内容

pointer1 = (char*)pointer3;	 //强制类型转换

现在pointer1和pointer3中储存的地址相同,假设是x,但使用它们操作该地址对应的数据时就会有所不同。
使用pointer1进行运算或赋值时,从x开始的1个字节参与,而使用pointer3进行运算和赋值时,从x开始的4个字节参与。

应用

通过指针类型的强制转换,我们可以对多个字节的数据类型分别进行单字节和整体的操作,再对数据的变换(编码算法,密码算法等)中可以得到很多运用,提高效率。

你比如说:

unsigned char arrayA[4] = {0x11, 0x11, 0x11, 0x11};
unsigned char arrayB[4] = {0x00, 0x11, 0x00, 0x11};

我们想对这两个数组进行异或操作, 结果保存在arrayA中,就不必一个字节一个字节去操作了,而使用下面的写法:
*(unsigned long int*)arrayA = *(unsigned long int*)arrayA ^ *(unsigned long int*)arrayB;

再比如说:

unsigned long int data = 0xffffffff;
unsigned char* pointer;

我们想对data的4个字节分别操作,可以使用如下方法:
pointer = (unsigned char*)&data;//&时取地址符,因为data是unsigned long类型,&data表示一个该类型指针
*(pointer + 1) = 0x00;
*(pointer + 3) = 0xee;

以下是简单测试:

测试一:
在这里插入图片描述

代码

unsigned long int data = 0xffffffff;
unsigned char* pointer;

printf("data赋值前:%lx\n",data);

pointer = (unsigned char*)&data;
*(pointer + 1) = 0x00;
*(pointer + 3) = 0xee;

printf("data赋值后:%lx\n",data);

测试二:
在这里插入图片描述

代码

unsigned char arrayA[4] = {0x11, 0x11, 0x11, 0x11};
unsigned char arrayB[4] = {0x00, 0x11, 0x00, 0x11};

printf("arrayA运算前:%02x %02x %02x %02x\n",arrayA[0],arrayA[1],arrayA[2],arrayA[3]);

*(unsigned long int*)arrayA = *(unsigned long int*)arrayA ^ *(unsigned long int*)arrayB;

printf("arrayA运算后:%02x %02x %02x %02x\n",arrayA[0],arrayA[1],arrayA[2],arrayA[3]);
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值