学习笔记_C语言指针

指针与底层硬件紧密相连,使用指针可以操作数据的地址,实现数据的间接访问

1、计算机存储模式

小端存储模式,例如int a 中0x78先放在了地址0x4000中

数组char 类型,是按顺序存储且是连续空间,如图

当数组存储 short [0x5A6B,0x0000],这就是跨字节存储,第一项是会放在0x4009,但是是0x6B然后第二个0x400A存储的是0x5A

2、指针

指针就是指针变量,用来存储其他数据单元(变量、数组、结构体、函数)的首地址。若指针存放了某个数据单元的首地址,则这个指针指向了这个数据单元,若指针存放的是0,这个就是空指针

指针找地址有间接执行的方式,如图定义 

char a=0x66;

char *p;

p=&a; 把A的地址存到P这个指针变量里面,以小端存储的方式

第二句printf函数是直接读取当前指针里面的值,后面0省略掉了

第三个printf函数类似寻址机制,先把指针P地址里面数据读取,发现是a的地址,再以char的方式读取a地址里面的值,这就是间接寻址机制

指针的移动是用于移动数据宽度,例如定义指针是int型那移动一个数据宽度就是4个字节

移动char型就是1个字节,指针的加减操作一般用于指针数组,这样加减位置才有意义否则指针会越界

3、指针与数组

数组是一些相同数据类型的变量组成的集合,其数组名为指向该数据类型的的指针,数组的定义等效于申请内存,定义指针和初始化

4、指针的应用

一、传递参数,使用指针传递大容量参数,主函数与子函数使用同一套数据,避免参数传递过程中的数据复制,减少内存使用

流程,先定义一个A随机一个空间,调用这个函数的时候又会申请新的内存空间,把a的值复制进去,主函数和子函数数据隔离,在主函数中a的值是不会变的,在此过程a会复制一份值,放到子函数中,子函数随意更改使用,保证安全,但是会造成内存的浪费

const标识,标识常量,如果修改里面值编译器会发出警告

反之如果用指针传递,大家共用一套数组,新建出来空间只是会保存这个变量地址,然后指针寻址去对应值,用完就会销毁这段空间,可以减少内存使用,但是值不安全,子函数随意更改主函数将受到影响,一般用const标明常量无法更改

二、利用指针传递输出参数,利用主函数主函数子函数共同使用一套数据的特性,实现数据的返回,可实现多返回值函数的设计 

那么如何实现多返回值设计呢,在子函数定义了int *max 指针,然后在主函数中有声明int MAX这个参数后,内存空间开辟4个字节给int 调用子函数时,会申请属于*max的指针地址,64位计算机有8个字节空间,那么在调用子函数时,用上取地址&取MAX这个int数据地址给了这个指针空间,当子函数运行时候,根据指针地址索引到MAX这个存储空间,修改这个存储空间值,调用函数结束后 int MAX这个空间值也跟着改变了,就实现多返回值的改变,此时指针所占空间也销毁

三、传递返回值

将模块内共有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作

封装好一个模块,模块内有全局变量数组,可以设计一个函数对齐句柄取地址,返回一串值,int*函数,返回的是Time数组的地址,那么在主函数定义一个指针pt就可以接住这个数组的值,每一位都对应上了

四、直接访问物理地址+将复杂格式转换为字节方便存储

第一步,定义浮点数,因为浮点数占据内存4个字节,然后再定义无符号指针,把浮点数地址取进指针,防止警告要进行强制转换,然后把这个数组发出去

第二步

接受的话需要定义float*类型指针,把接到的数组强制转换为float类型

完结撒花 资料全来自bili江科大

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值