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]);
c语言指针强制类型转换的应用相关推荐
- C语言指针强制类型转换
概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...
- 指针强制类型转换触发内存自动对齐
C语言的指针是我们操作很灵活,但是也留下了不少坑,今天工作遇到了一个指针的坑,这里复现一下: 指针类型强制转换,并进行解引用,引起的内存对齐问题. (一)问题复现: 运行环境:Ubuntu 16.04 ...
- c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- c语言运算符类型转换,C语言中强制类型转换运算符的独特作用
C语言中强制类型转换运算符的独特作用 在C语言中有一个强制类型转换运算符,它为C语言中的数据类型转换带来 (本文共2页) 阅读全文>> 在进行C++类的设计时,我们常常需要为类对象设计运算 ...
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- c语言强制转化指针,C语言指针强制转化的应用
指针类型强制转化在kernel设计中非常常见,这里记录两个非常有意思的用法: 1.对地址进行运算.任何虚拟地址都表示成void *va = (void *) 100, *(va + 1) ==101 ...
- C语言:强制类型转换、自动类型转换
C语言中类型转换有两种方式:即强制类型转换和自动类型转换. 一.强制转换比较简单,为:(类型)操作对象. int n1 = 5, n2 = 2; float f1 = (float) 5 / 2; / ...
- c语言字符串强制类型转换,C语言学习九 —头文件强制类型转换错误处理
预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理.我们将把 C 预处理器( ...
最新文章
- 深入理解argparse模块中的add_argument的参数(如action等)
- R | 对亚马逊新总部可能位置进行可视化
- Some best freeware
- linux 文件大小_整理 | Linux下列出目录内容命令
- Python音频信号处理 2.使用谱减法去除音频底噪
- mysql手动安装配置,mysql8.0.11 winx64手动安装配置教程
- Docker安装禅道项目管理平台zendao-v11.6.x
- php v9验证码错误,PHPCMS v9后台登陆提示验证码错误的解决方法
- ceph基本架构及数据分布原理
- Hystrix-异常处理
- 1177: 按要求排序(指针专题)_L2算法基础第10课 排序中
- xmind怎么在左边创建_威纶通 触摸屏自动化应用篇 创建程序界面及画面应用
- appscan无法连接到服务器_GTA5无法连接R星服务器怎么解决?无法连接解决方法
- 【Brazilian ICPC Regionals - 2018】Soteros【树上启发式合并】
- 非常好用的自助建站程序整站源码 内置几十种站
- 计算机仿真和vr的区别,扫盲科普:今天才知道VR和AR的区别
- 三星电子中国研究院院长张代君:Bixby绝非炫技而是为提升用户体验而生
- alias template,升级的typedef
- 线性回归和贝叶斯的线性回归
- 出行即服务MAAS专辑(2022)(可下载)