指针传 1

1. 内存

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

2. 指针变量和地址

2.1 取地址操作符(&)

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

指针传 1_第1张图片

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

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

指针传 1_第2张图片

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

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

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

指针传 1_第3张图片

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

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

指针传 1_第4张图片

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

3. 指针变量类型的意义

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

指针传 1_第5张图片

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

指针传 1_第6张图片

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

3.1 指针+-整数

指针传 1_第7张图片

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

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

指针传 1_第8张图片

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

指针传 1_第9张图片

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

4. const修饰指针

4.1 const修饰变量

指针传 1_第10张图片

 那么我们看见经过const修饰过后的b后,是不能被修改的。但是我们通过另外一种途径也可以修饰:指针传 1_第11张图片

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

4.2 const修饰指针变量

指针传 1_第12张图片指针传 1_第13张图片

 指针传 1_第14张图片

 我们可以看见const在*左边修饰时,无法改变*p,const在*右边修饰时,无法改变p,左右两边都有时则都不能改变。

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

你可能感兴趣的:(c语言,学习,指针)