一、内存和地址
1.1 内存
在讲内存和地址之前,我们想有个⽣活中的案例: 假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩, 如果想找到你,就得挨个房⼦去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给 每个房间编上号,如:
⼀楼:101,102,103...
⼆楼:201,202,203....
...
有了房间号,如果你的朋友得到房间号,就可以快速的找房间,找到你。
如果把上⾯的例⼦对照到计算中,⼜是怎么样呢? 我们知道计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数 据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何⾼ 效的管理呢? 其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。
其中,每个内存单元,相当于⼀个学⽣宿舍, 每个内存单元也都有⼀个编号(这个编号就相当 于宿舍房间的⻔牌号),有了这个内存单元的编号,CPU就可以快速找到⼀个内存空间。⽣活中我们把⻔牌号也叫地址,在计算机中我们 把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫:指针。
所以我们可以理解为: 内存单元的编号 == 地 址== 指 针
二、指针变量和地址
2.1 取地址操作符(&)
理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实就是向内存申请空间,⽐如:
#include <stdio.h>
int main()
{
int a = 10;
return 0;
}
⽐如,上述的代码就是创建了整型变量a,内存中 申请4个字节,⽤于存放整数10,其中每个字节都 有地址。
那我们如何能得到a的地址呢?这⾥就得学习⼀个操作符(&)——取地址操作符
#include <stdio.h>
int main()
{
int a = 10;
&a;//取出a的地址
printf("%p\n", &a);
return 0;
}
运行结果为:
&a取出的是a所占4个字节中地址较⼩的字节的地址。虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,顺藤摸⽠访问到4个字节的数据也是可⾏的。
2.2指针变量和解引⽤操作符(*)
2.2.1指针变量
那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x006FFD70,这个数值有时候也是需要存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。
⽐如:
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;//取出a的地址并存储到指针变量pa中
return 0;
}
指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址
2.2.2如何拆解指针类型
我们看到pa的类型是int*,我们该如何理解指针的类型呢?
1 int a = 10;
2 int * pa = &a;
* 是在说明pa是指针变量,⽽前⾯的int是在说明pa指向的是整型(int)
那如果有⼀个char类型的变量ch,ch的地址,要放在什么类型的指针变量中呢?
char ch = 'w';
char* pc = &ch;
2.2.3解引⽤操作符
我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?
我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,这⾥必须学习⼀个操作符叫解引⽤操作符(*)。
#include <stdio.h>
int main()
{