重拾童趣

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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]);
posted on 2019-04-19 15:56  重拾童趣  阅读(2227)  评论(0编辑  收藏  举报