专栏中心

EEPW首页 > 专栏 > 关于指针类型和指针类型转换的理解

关于指针类型和指针类型转换的理解

发布人:电子禅石 时间:2020-04-13 来源:工程师 发布文章

 前几天在判断  值相同的两个指针所指向的变量的值可以不同  这句话时,发现自己对指针类型一些概念仅仅是记住了结论。于是查阅了一些资料,记录一下一些与指针类型和指针类型转化相关的知识。

 一些用到的

开始之前,先来复习一些会用到的知识。

1.地址,字节,位

  位(bit)是电子计算机中最小的数据单位。每一位的状态只能是0或1。

  字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit)。

  地址可以理解为在一片内存中,每个字节(Byte)的编号。

  他们在内存中的关系可以比作,内存是一栋大楼,字节(Byte)是大楼中的每一层,地址是楼层编号,位(bit)是每一层中的房间,每一层有8个房间。

   

 

2.变量的内存

  编译器根据变量的类型,在内存中申请一块空间。例如32位与64位中 int 类型申请到4字节的空间,可理解为编译器申请了4层楼,作为”办公区域“。

3.指针变量

  指针是指程序数据在内存中的地址。在c语言当中,允许用一个变量来存放指针,这种变量称为指针变量。

 

指针变量类型的作用

1   int a;2   int *p;3   p = &a;4   printf("%p %d\n",p,*p);

  以上程序中,”&“操作符取出了变量 a 在内存空间中的首地址,而后通过 “ * ”  操作符取出首地址所在内存空间的数据。

  前面我们提到,存储变量的内存,是由多个字节组成。而指针变量在只知道首地址(第一个字节的地址)的情况下,就能找到a的内存区域。它是怎么做到的?先来看看指针变量的声明。

  我们在声明一个指针变量的时候,会根据它将要指向的变量类型,声明对应的类型,例如:

复制代码
1     int a;2     long b;3     char c;4 5     int *pa = &a;6     long *pb = &b;7     char *pc = &c;
复制代码

  不管是什么类型的指针变量,所存的值都是地址(int类型的值)。那么声明不同类型的作用是什么?答案是规定指针在内存中每次移动的字节数。

  例如定义“int *pa = &a”,取值时,int类型占4个字节,指针就从首地址开始移动读取4个字节。同理,short类型占2字节,指针就移动2字节。通过声明指针类型,告诉指针每次移动多少字节,来获取变量的值。

 

值相同的两个指针所指向的变量的值可以不同

  “值相同的两个指针变量”,意思是两个指针变量指向同一个首地址。但是如果指针变量的类型不同,因为指针移动的字节数量不同,就可能读取出不同的数据

  要实现不同类型指针变量指向同一个地址,需要使用指针类型转换。

1     short a = 1;2     short *p1 = &a;3     int *p2 = (int *)p1;4     printf("%d %d",*p1,*p2);

   以上例子将一个每次移动读取2字节的 short 类型指针变量,转化为一个每次读取4字节的int型指针变量。

   接下来,我们通过指针类型转换,用同一个首地址,取出不同的值。

复制代码
 1 #include <stdio.h> 2 int main() 3 { 4     short c[2];               //等价于申请2个连续的内存空间,每个空间2字节  5     c[0] = 1;                //为第一个short空间赋值为1  6     c[1] = 1;                //为第二个short空间赋值为1  7     short *p1 = c;            //p1指向c[]首地址  8     int *p2 = (int *)p1;      //p2指向c[]首地址,并强制转换类型为 int  9 10     printf("p1指向:%p\np2指向:%p\n",p1,p2);      
11     printf("p1取出:%d\np2取出:%d\n",*p1,*p2);12     return 0;13 }14
复制代码

  对应结果为: 

    p1指向:000000000062FE30
    p2指向:000000000062FE30
    p1取出:1
    p2取出:65537

  

    

    根据二进制转换得,10000000000000001 为 65537。由此可验证强制转换前指针读取2字节,转化后读取4字节。两个指针指向的首地址相同,但是读出了不同的结果。


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

masm 5.0

资源下载 2007-02-28

飞思卡尔无线充电解决方案

视频 2011-08-25

AI Scale Up 用 Infraeo 和 Marvell 的 9 米 800G AEC 进行距离测量

作业帮发布新一代学练机S50,汇顶科技赋能智能书写新体验

Bourns 推出金属合金叠层功率电感器,具备高电流承载能力

提升定制计算性能上限的三项新技术

智能计算 2025-11-25

TI永磁同步BLDC电机控制FOC控制方案演示

百万XPU时代的人工智能连接

电动汽车无线充电演示视频

AI存储的下一步:GPU发起和CPU发起存储

智能计算 2025-11-25

Logiscope testChecker简介

富士通开发出手机无线充电设备报道

视频 2011-08-24

【IEEE好文分享】什么是神经符号AI

开放创芯,成就未来——ICCAD-Expo 2025成功举办!

2025-11-25

关于PB4.2

hedonghe 2005-04-06

AM29LV160D

手机无线充电演示

视频 2011-08-25

max+plus2 baseline10.0 安装软件

联合光学:推动下一波AI数据中心创新浪潮

网络与存储 2025-11-25

更快、更远、更光学化:PCIe如何加速AI革命

智能计算 2025-11-25
更多 培训课堂
更多 焦点
更多 视频

技术专区