详解指针1
哈喽,各位老铁们。本期博主给大家分享一下C语言最难也是最重要的知识-----指针;OK呀让我们一起沉浸在知识的海洋吧!
本期大纲
以上就是本期内容的大纲,接下来博主将带着大家一起学习!
一、内存和地址
首先给大家分享一个生活中的例子便于更好的理解概念;
小明,周末出去玩晚上登记了一家酒店;酒店有20几层上百间房,小明也不能一间一间的去找自己登记的房子。因此,他可以直接按照自己订单或者酒店前台人员的提示直接按照房间号去找到自己的房子。
在生活中,为了提高找房子的效率,人们给房子编上号;其实计算机在处理数据的时候也是类似的;
我们都知道计算机CPU处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会返回给内存;
为了高效的管理内存空间,将内存划分为一个一个的内存单元,它的大小取1字节;
这里给大家补充一下计算机中常见的单位:
我们可以这样理解,我们把一个内存单元当作一间学生宿舍,一间宿舍里面住着8个同学;正好一个内存单元里面放着8个比特位;
二、指针变量和地址
2.1取地址操作符(&)
在C语言中我们创建一个变量,其实就是相当于向内存申请空间;
2.2指针变量
上面我们取出a的地址了,那么它的地址到底存放在哪里呢?
将它存放在指针变量中;
指针变量是一种变量,是专门用来存放地址的,存放在指针变量中的地址被理解为指针;
2.3解引用操作符(*)
上面我们将地址保存起来了,我们最终目的就是通过指针找到指针指向的对象,这里我们就需要用到解引用操作符来使用指针;
2.4指针变量的大小
在X86环境下测试
在X64环境下测试
三、指针变量的意义
3.1指针的解引用
3.2指针加减整数
我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
3.3void*指针
void*指针也叫泛型指针,无具体类型;它可以接受任何类型的指针;但是它不能进行+-整数和解引用操作;
四、const修饰指针
我们都知道一个变量是可以随意改变的;指针变量存储的是我们目标元素的地址,我们并不希望它能够被随意修改,这里我们就要使用const对指针变量进行限制;
const修饰指针变量
五、指针运算
5.1指针+-整数运算
我们直到数组在内存中是连续存储的,我们只需要直到第一个元素的地址,就能退出其他所有元素的地址;
5.2指针-指针
5.3指针的关系运算
六、野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
造成野指针的原因:
1.指针未初始化
2.指针越界访问
3.指针指向的空间释放
那么该如何规避野指针呢?
1.检查指针是否初始化(如果不知道指针指向哪里可以 初始化为空值NULL)
2.小心指针越界
3.指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性
七、assert指针
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏。这个宏常常被称为“断⾔”。
八、指针的使⽤和传址调⽤
8.1 strlen的模拟实现

8.2 传值调⽤和传址调⽤

接下来我们使用指针来解决这个问题:
总结
本期博主,带领大家一起学习了C语言的指针的相关知识;从计算机的内存和地址,到指针变量和地址,通过画图的方式详细介绍了指针变量的相关内容;以及指针的运算和指针的使用,都通过画图和代码练习带领大家一起学习;各位老铁在下面也可以自己画图掌握这一块内容;
学习的时光总是短暂的,以上就是本期要给大家分享的所有内容了;下一期的内容也很精彩,敬请期待;如果你觉得本文对你有帮助,请三连支持一下;你的支持是我持续创作最大的动力;