指针类型简介

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;    //强制类型转换

现在pointer1pointer3中储存的地址相同,假设是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语言指针强制类型转换的应用相关推荐

  1. C语言指针强制类型转换

    概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...

  2. 指针强制类型转换触发内存自动对齐

    C语言的指针是我们操作很灵活,但是也留下了不少坑,今天工作遇到了一个指针的坑,这里复现一下: 指针类型强制转换,并进行解引用,引起的内存对齐问题. (一)问题复现: 运行环境:Ubuntu 16.04 ...

  3. c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  4. C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  5. c语言运算符类型转换,C语言中强制类型转换运算符的独特作用

    C语言中强制类型转换运算符的独特作用 在C语言中有一个强制类型转换运算符,它为C语言中的数据类型转换带来 (本文共2页) 阅读全文>> 在进行C++类的设计时,我们常常需要为类对象设计运算 ...

  6. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  7. c语言强制转化指针,C语言指针强制转化的应用

    指针类型强制转化在kernel设计中非常常见,这里记录两个非常有意思的用法: 1.对地址进行运算.任何虚拟地址都表示成void *va  = (void *) 100, *(va + 1) ==101 ...

  8. C语言:强制类型转换、自动类型转换

    C语言中类型转换有两种方式:即强制类型转换和自动类型转换. 一.强制转换比较简单,为:(类型)操作对象. int n1 = 5, n2 = 2; float f1 = (float) 5 / 2; / ...

  9. c语言字符串强制类型转换,C语言学习九 —头文件强制类型转换错误处理

    预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理.我们将把 C 预处理器( ...

最新文章

  1. 深入理解argparse模块中的add_argument的参数(如action等)
  2. R | 对亚马逊新总部可能位置进行可视化
  3. Some best freeware
  4. linux 文件大小_整理 | Linux下列出目录内容命令
  5. Python音频信号处理 2.使用谱减法去除音频底噪
  6. mysql手动安装配置,mysql8.0.11 winx64手动安装配置教程
  7. Docker安装禅道项目管理平台zendao-v11.6.x
  8. php v9验证码错误,PHPCMS v9后台登陆提示验证码错误的解决方法
  9. ceph基本架构及数据分布原理
  10. Hystrix-异常处理
  11. 1177: 按要求排序(指针专题)_L2算法基础第10课 排序中
  12. xmind怎么在左边创建_威纶通 触摸屏自动化应用篇 创建程序界面及画面应用
  13. appscan无法连接到服务器_GTA5无法连接R星服务器怎么解决?无法连接解决方法
  14. 【Brazilian ICPC Regionals - 2018】Soteros【树上启发式合并】
  15. 非常好用的自助建站程序整站源码 内置几十种站
  16. 计算机仿真和vr的区别,扫盲科普:今天才知道VR和AR的区别
  17. 三星电子中国研究院院长张代君:Bixby绝非炫技而是为提升用户体验而生
  18. alias template,升级的typedef
  19. 线性回归和贝叶斯的线性回归
  20. 出行即服务MAAS专辑(2022)(可下载)

热门文章

  1. 2022kali安装docker教程
  2. ie浏览器调用本地文件无反应_win7 ie浏览器打不开本地htm文件
  3. [导入]把域名转到了GoDaddy下
  4. telnet ip地址报接口23连接失败。
  5. Web Work 简介
  6. (跟新至2019)历年研究生数学建模题目与优秀论文
  7. PaddleOCR识别繁体中文和其他国家文字
  8. MOT:Metrics MOTA
  9. Git学习--分支(branch、merge、rebase)
  10. android里的 ARGB 和 RGB