C语言快速入门
一、指针是什么
指针就是变量,用来存放地址的变量
计算机中有偌大的内存,那么如何管理这些内存呢,我们类比管理楼宇的方法,将楼的每个房间进行编号,比如一单元402 这样就可以找到了这见屋子
那么我们将内存进行编号,这些编号就可以帮我们找到内存中的某块空间,所以说这些编号就是某块内存单元的地址,通过地址可以找到对应的内存单元,也可以说这些地址指向了内存单元,所以将地址也叫做指针。
内存单元的编号怎么产生的呢?
如32位机器,通电后会2^32次方种可能性,这些即可作为内存的编号
(一)内存如何编号
1 Byte = 8 Bits
1 KB = 1024 Bytes
1 MB = 1024 KB
1 GB = 1024 MB
- 将内存划分为一个个的小单元,一个小单元是1个字节
- 通过规定,将这些小单元进行编写地址,在通过规定,
-----如果是32位机器,有2^32个编号,就意味着有这么多的字节,换算成GB也就是4G的空间
-----如果是64位机器,有2^64个编号,意味着有这么多的字节,数值大于1亿GB
也就是说32位系统的处理器最大只支持到4G内存,而64位系统最大支持的内存高达亿位数,实际运用过程中大多数的电脑32位系统最多识别3.5GB内存,64位系统最多识别128GB内存
(二)指针的大小
指针是用来存储地址的变量,那么指针的大小是多少呢
32位机器------地址大小有32位,就是32个bit,换算位4个字节,所以需要4个字节的空间来存储
64位机器------地址大小有64位,就是64个bit,换算位8个字节,所以需要8个字节的空间来存储
二、指针和指针类型
前置知识:
4个二进制位可以表示一个16进制数字
(一)指针类型的两个意义
- 指针类型决定了指针解引用的权限有多大
整形指针解引用访问4个字节
字符形指针解引用访问1个字节
doubie访问8个字节
2. 指针类型决定了指针走一步走多远
整形指针加1 步长为4个字节
字符型指针加1 步长为1 字节
三、野指针
野指针就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)
(一)野指针成因
-
指针没有初始化
因为局部变量没有初始化 默认是随机值
-
指针越界
超出指针访问范围了越界 -
指针指向的空间释放
曾经是你的,但你不珍惜,分手后你后悔莫急,可以你已经不能访问他了
局部变量a在函数结束后销毁了
(二)避免出现野指针
-
指针初始化
-
小心指针越界
-
指针指向空间释放后,及时防止NULL
-
在使用指针使用之前,检查有效性
四、指针的运算
指针加减整数
指针关系运算
指针减去指针(前提是两个指针指向同一块空间)得到的是之间元素个数
五、指针和数组
数组名就是数组首元素地址
五、二级指针
int * pa
int * 表示是指针变量存的是地址 谁的地址呢 指针变量的地址,那怎么表示指针变量呢,用pa表示
怎么使用呢
六、指针数组
七、单片机中的指针
- 手机的运行需要存储卡,单片机的内部也有存储空间,
- 将这片空间进行划分,并进行编号,但是标号很难记住,
- 比如这个空间的标号为32位,也就是32bit叫1111 1111 1111 1111 1111 1111 1111 1111,根本记不住好吧
- 那么我们为了方便记住,给这些标号对应的地址另外起个名字,如图片中205号,我们既可以叫它205,还可以叫它单片机实验室…
- 单片机对数据的存储,可以比作,到房间中放椅子或拿椅子
- 指针就是地址
- 那么比如105这个房间,到底可以放多少椅子呢?
- unsigned char a; 0~255 2的8次方
- unsigned int a ;0~65535 2的16次方
- char a; -128~127
- &符号:取址符 得到变量的实际地址
- *符号:取值符
- 指针变量:就是存放内存地址的变量
- 指针和指针变量是两个不同的概念,通常会把指针变量简称为指针
上面这个代码中的值 是PP去改变,LED没有变
这个步骤 操作了LED的改变
当想要在子函数中,改变主函数变量的值时,采用指针
主函数调用子函数,且发生值传递,需要用到指针