指针传 1

1. 内存

在计算机中内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。每个内存单元放了八个bite位,就像我们在高中时住的八人间,那么每个人就代表了一个bite位。
每个内存单元也都有⼀个编号(这个编号就相当 于我们所住的寝室号),有了这个内存单元的编 号,CPU就可以快速找到⼀个内存空间。
⽣活中我们把⻔牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫: 指针
所以我们可以理解为: 内存单元的编号 == 地址 == 指针

2. 指针变量和地址

2.1 取地址操作符(&)

在C语言中,我们创建变量时其实就是在向内存申请空间,我们来看一个示例:

上述的代码就是创建了整型变量a,那么就在内存中申请4个字节,⽤于存放整数5,其中每个字节都有地址,上图中4个字节的地址就是画圈里面所展示的。

那么在C语言中,我们怎样获取a的地址呢?那么就要学习我们的取地址操作符了(&)

&a取出的是a所占4个字节中地址较⼩的字节的地址,我们只要知道了第⼀个字节地址,后面的也都可以知道了。

2.2 指针变量和解引⽤操作符(*)

2.2.1 指针变量

我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x00BAF834,这个数值有时候也是需要 存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?那我们就把它储存在: 指针变量中。

取出 a的地址并储存到地址变量p中去,指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。

2.2.2 如何拆解指针类型

我们看到p的类型是 int* ,我们该如何理解指针的类型呢?
那么int表示p所指向的对象是整型变量,而*则表示p是一个指针变量。

2.2.3 解引⽤操作符

我们看到,我们通过了*p去改了num的值,而且还成功了。*p的意思就是通过p中存放的地址,找到指向的空间, *p其实就是num变量了;所以*p = 10,这个操作符是把num改成了10.

3. 指针变量类型的意义

指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各种各样的指针类型呢?

那么在 上图红色圆圈中我们看见了,四个都被改成了0.接下来我们来看看其他变量类型的一个效果:

那么看见用char*的话只改变了一个,那么我们可以知道:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。

3.1 指针+-整数

我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。所以说不同类型的指针还是有不同之处哈!

3.2 void* 指针

⽆具体类型的指针(或者叫泛型指 针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进 ⾏指针的+-整数和解引⽤的运算。

那么会显示类型的不兼容,那么用到空指针就不会出现这样的问题了:

那么会看见非法的间接寻址,所以说空指针不能进行指针运算!

4. const修饰指针

4.1 const修饰变量

那么我们看见经过const修饰过后的b后,是不能被修改的。但是我们通过另外一种途径也可以修饰:

这里我们通过了指针的方式修改了n的值,但是如果我们绕过n,使⽤n的地址,去修改n就能做到了,虽然这样做是在打破语法规则。我们可以看到这⾥⼀个确实修改了,但是我们还是要思考⼀下,为什么n要被const修饰呢?就是为了不能被修改,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所应该让 p拿到n的地址也不能修改n,那接下来怎么做呢?

4.2 const修饰指针变量

我们可以看见const在*左边修饰时,无法改变*p,const在*右边修饰时,无法改变p,左右两边都有时则都不能改变。
const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。
咱们下期见!

相关推荐
代码雕刻家27 分钟前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
slomay1 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
hengzhepa1 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
代码雕刻家2 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
龙图:会赢的2 小时前
[C语言]--编译和链接
c语言·开发语言
小小洋洋3 小时前
BLE MESH学习1-基于沁恒CH582学习
学习
Cons.W4 小时前
Codeforces Round 975 (Div. 1) C. Tree Pruning
c语言·开发语言·剪枝
Ace'4 小时前
每日一题&&学习笔记
笔记·学习
IM_DALLA4 小时前
【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25
学习·fpga开发·verilog学习