目录
1. 内存和地址
2. 指针变量和地址
3. 指针变量类型的意义
正文
1.内存和地址
1.1.内存
内存就像我们生活中的门牌号,通过门牌号,你的好朋友能够准确的找到你家的具体地址,这样就更加方便,而不是一间一间去确认是不是你家。我们计算机的中央处理器(cpu)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回到内存中。生活中我们的门牌号也可以叫地址,在C语言中我们把内存单元的编号也称为地址,并且给他取了个新名字--指针。
因此我们也可以理解为:内存单元的编号==地址==指针
2.指针变量和地址
2.1取地址操作符(&)
C语言当中,创建变量其实就是向内存申请空间,比如:
上述代码就是创建了个整形变量,向内存中申请了4个字节的空间,用于存放整数5,每个字节都有对应的地址,那我们要怎么获取a的地址呢?
这里就要用到一个操作符——>取地址操作符(&)
2.2 指针变量和解引用操作符
2.2.1 指针变量
我们通过取地址操作符取出来的地址是一个数值,有时候这个数值也要存起来方便后期的使用,这样就产生了指针变量这个东西,代码演示如下:
指针变量本质也是一种变量,这种变量就是用来存放指针的
2.2.2 如何拆解指针类型
上述代码当中pa变量的类型是int*类型,那么我们要怎么理解指针的类型呢?
上述的int*当中,*是在说明pa是指针变量,前面的int则是说明pa指向的是整型类型的对象。
整型变量的指针是如此,那么对于char类型的变量,指针变量类型又要怎么写呢?请看以下代码
2.2.3 解引⽤操作符
我们将地址保存后,需要使用的时候要怎么用呢?
在C语言中,只要我们获取了一个地址,就可以通过地址找到地址所指向的对象,这里就要用到一个操作符——>
解引用操作符(*),废话不多说,直接看代码演示
上述的代码当中就使用了解引用操作符——*pa,意思就是通过pa中的地址,找到其所指向的空间也就是变量a,
所以*pa = 0,这个操作符是把a改成了0
2.3
指针变量的大小
这里直接通过代码来表述
3.
指针变量类型的意义
既然说指针变量的大小和和类型无关,只要是指针变量,在同一个平台下,大小都一样,那有这么多类型的指针意义在哪里呢?
既然存在,那他必然是有自己的意义的,不然拿来干嘛,看又不好看,我们继续往下学习
3.1 指针的解引用
对比一下上面两个代码,在编译器上进行调试我们会发现第一个代码会把n的4个字节全部改为0,而第二个代码只会将n的第一个字节改为0;
因此我们得出
结论:
指针的类型决定了对指针解引用的时候有多大权限(一次能操作几个字节)
3.2指针+-代码
先来段代码助助兴
运行结果如下
可以看得出来,类型的指针变量+1跳过1个字节,int*类型的指针变量+1跳过4个字节,这就是指针变量的类型差异带来的变化
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)
3.3void*指针
指针类型中有一种比较特殊的类型叫void*类型,可以理解为无具体类型的指针(泛型指针),这种类型的指针可以接受任意类型地址,但同时也有局限,void*类型的指针不能直接进行指针的+-整数和解引用运算,代码演示
上面的代码将一个int类型的变量的地址赋值给一个char*类型的指针变量,在调试时编译器给出了读取字符串字符时出错,而使用void*类型就不会有这样的问题
使用void*类型的指针接收地址
编译器会直接报错,这里就能体现出来void*类型的指针可以接收不同类型的地址,但是无法进行指针运算
那void*到底有什么用呢?
一搬void*类型的指针是在函数参数部分使用的,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。
时间关系(还要留时间刷题),今天就写这么多,我们周四再见,这周我会把C语言指针部分完整复习一遍,当然也会全都发出来