详解指针1

哈喽,各位老铁们。本期博主给大家分享一下C语言最难也是最重要的知识-----指针;OK呀让我们一起沉浸在知识的海洋吧!

本期大纲

以上就是本期内容的大纲,接下来博主将带着大家一起学习!


一、内存和地址

首先给大家分享一个生活中的例子便于更好的理解概念;

小明,周末出去玩晚上登记了一家酒店;酒店有20几层上百间房,小明也不能一间一间的去找自己登记的房子。因此,他可以直接按照自己订单或者酒店前台人员的提示直接按照房间号去找到自己的房子。

在生活中,为了提高找房子的效率,人们给房子编上号;其实计算机在处理数据的时候也是类似的;

我们都知道计算机CPU处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会返回给内存;

为了高效的管理内存空间,将内存划分为一个一个的内存单元,它的大小取1字节;

这里给大家补充一下计算机中常见的单位:

我们可以这样理解,我们把一个内存单元当作一间学生宿舍,一间宿舍里面住着8个同学;正好一个内存单元里面放着8个比特位;

每个内存单元也都有⼀个编号(这个编号就相当 于宿舍房间的⻔牌号),有了这个内存单元的编
号,CPU就可以快速找到⼀个内存空间。
⽣活中我们把⻔牌号也叫地址,在计算机中我们 把内存单元的编号也称为地址。C语⾔中给地址起
了新的名字叫:指针。
所以我们可以理解为: 内存单元的编号 == 地址 == 指针

二、指针变量和地址

2.1取地址操作符(&)

在C语言中我们创建一个变量,其实就是相当于向内存申请空间;

2.2指针变量

上面我们取出a的地址了,那么它的地址到底存放在哪里呢?

将它存放在指针变量中;

指针变量是一种变量,是专门用来存放地址的,存放在指针变量中的地址被理解为指针;

2.3解引用操作符(*)

上面我们将地址保存起来了,我们最终目的就是通过指针找到指针指向的对象,这里我们就需要用到解引用操作符来使用指针;

2.4指针变量的大小

在X86环境下测试

在X64环境下测试

结论:
32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

三、指针变量的意义

3.1指针的解引用

结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。

3.2指针加减整数

我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。

3.3void*指针

void*指针也叫泛型指针,无具体类型;它可以接受任何类型的指针;但是它不能进行+-整数和解引用操作;

四、const修饰指针

我们都知道一个变量是可以随意改变的;指针变量存储的是我们目标元素的地址,我们并不希望它能够被随意修改,这里我们就要使用const对指针变量进行限制;

const修饰指针变量

结论:const修饰指针变量的时候
const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变

五、指针运算

5.1指针+-整数运算

我们直到数组在内存中是连续存储的,我们只需要直到第一个元素的地址,就能退出其他所有元素的地址;

5.2指针-指针

5.3指针的关系运算

六、野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

造成野指针的原因:

1.指针未初始化

2.指针越界访问

3.指针指向的空间释放

那么该如何规避野指针呢?

1.检查指针是否初始化(如果不知道指针指向哪里可以 初始化为空值NULL)

2.小心指针越界

3.指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性

七、assert指针

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏。这个宏常常被称为“断⾔”。

八、指针的使⽤和传址调⽤

8.1 strlen的模拟实现

库函数strlen的功能是求字符串⻓度,统计的是字符串中 \0 之前的字符的个数。

8.2 传值调⽤和传址调⽤

学习指针的⽬的是使⽤指针解决问题,那什么问题,⾮指针不可呢?
例如:写⼀个函数,交换两个整型变量的值

接下来我们使用指针来解决这个问题:

swap()将变量的地址传 递给了函数,这种函数调⽤⽅式叫:传址调⽤


总结

本期博主,带领大家一起学习了C语言的指针的相关知识;从计算机的内存和地址,到指针变量和地址,通过画图的方式详细介绍了指针变量的相关内容;以及指针的运算和指针的使用,都通过画图和代码练习带领大家一起学习;各位老铁在下面也可以自己画图掌握这一块内容;


学习的时光总是短暂的,以上就是本期要给大家分享的所有内容了;下一期的内容也很精彩,敬请期待;如果你觉得本文对你有帮助,请三连支持一下;你的支持是我持续创作最大的动力;

评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值