c语言指针强制类型转换的应用

2017年10月28日 22:04:24 行走的帝企鹅 阅读数:2530  

指针类型简介

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

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

你比如说

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
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;

以下是简单测试:

测试一: 
截图 
转载 :指针的强制类型转换 随笔 第1张 
代码

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);

测试二: 
截图 
转载 :指针的强制类型转换 随笔 第2张 
代码

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]);
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄