指针传 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如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。
咱们下期见!

相关推荐
map_vis_3d14 分钟前
JSAPIThree 加载简单点图层学习笔记:SimplePoint 散点可视化
笔记·学习·信息可视化·mapvthree·jsapithree·simplepoint·点图层
西瓜堆5 小时前
提示词工程学习笔记: 工程技术行业提示词推荐
笔记·学习
码不停蹄Zzz6 小时前
C语言第1章
c语言·开发语言
666HZ6667 小时前
数据结构2.0 线性表
c语言·数据结构·算法
SmartRadio7 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
charlie1145141918 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
好奇龙猫8 小时前
【AI学习-comfyUI学习-三十二节-FLXU原生态反推+controlnet depth(UNion)工作流-各个部分学习】
人工智能·学习
好奇龙猫9 小时前
【大学院-筆記試験練習:数据库(データベース問題訓練) と 软件工程(ソフトウェア)(7)】
学习
济6179 小时前
嵌入式C语言(第二期)
c语言
j_jiajia10 小时前
(一)人工智能算法之监督学习——KNN
人工智能·学习·算法