c语言指针强制类型转换的应用
指针类型简介
c语言中,指针是就是内存地址,因此使用指针可以方便的操作内存数据。指针的类型标志着这个指针指向数据的类型,有两个作用:
- 告诉了编译器需要从这个地址开始对多少字节(n)的数据进行操作, 以及操作模式
- 告诉编译器当对这个指针进行增减操作时,每加(减)一对应实际地址内存移动的字节数(n)
你比如说
char* pointer1 //该指针指向从该地址开始一个1字节的内容
short int* pointer2; //该指针指向从该地址开始一个2字节的内容
long int* pointer3; //该指针指向从该地址开始一个4字节的内容
long long int* ponter4; //该指针指向从该地址开始一个8字节的内容
pointer1++ 使其对应内存地址移动一个字节
pointer2++ 使其对应内存地址移动两个字节
pointer3++ 使其对应内存地址移动三个字节
pointer4++ 使其对应内存地址移动四个字节
指针的强制类型转换
指针类型的强制类型转换就是重新告诉编译器:
- 需要从这个地址开始对多少字节(n)的数据进行操作, 以及操作模式
- 对这个指针进行增减操作时,每加(减)一对应实际地址内存移动的字节数(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]);