1.为什么会有指针?
我们在描述一座宾馆里的客人时,经常会用该客人入住的房间号来代指该客人,比如301室,302室等等。这样前台只需要在抽屉里保存客人入住的房间牌号,在寻找该客人时,只需要打开抽屉,拿出牌号,根据牌号的信息就能在宾馆里找到该客人。
同样的,对于计算机,所有的程序都要在内存中运行,而内存的容量显然是有限的。以32位系统的计算机为例,理论上,该系统最大支持存储2的32次方个bit位,也就是4gb内存。
为了有效地使用珍贵的内存资源,我们将计算机的内存按照如下方式划分:
我们将内存划分成单个的单元,为了能够访问每一个单元,我们需要对这些划分好的单元进行编号,正如对宾馆的房间进行编号一样。这些编号就是内存单元的地址。
实例
#include <stdio.h>
int main()
{
int num = 10;
# //取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num); //打印地址,%p是以地址的形式打印
return 0;
}
结果
000000770D8FF744//十六进制
(111 0111 0000 1101 1000 1111 1111 0111 0100 0100二进制)
以上主程序过程可以理解为:
1.向内存申请4个字节单元储存一个int型变量,我把该int变量取名为num,随后将10赋值给此变量,这样这个存储着值的名为num的变量就会储存于申请的内存字节单元内
(该存储单元/房间号由计算机分配,此时我只知道我申请的房间类型,也知道我给该房间取的名字及我在房间内存放的内容,但我并不知道宾馆给我申请存储的变量内容放到了何处)
2.取出num的地址
(我向前台提出指示,我想知道我申请的房间地址,此时服务员需要打开抽屉拿出房间的牌子)
3.我要求打印出num的地址
(我要求前台展示房间牌子/地址给我)
2.如何创建指针
现在我们已经清楚了为什么会有内存单元地址,我们将对进一步通过实例来学习指针。
实例
#include <stdio.h>
int main()
{
int a = 10; //向内存申请4字符储存int变量 a
int* b = &a; //定义指针变量b,将存储变量a的地址储存在b
printf("%p\n", &a); //打印a的地址
printf("%p\n", b); //打印指针变量b的地址
return 0;
}
结果
000000FE83B6F574
000000FE83B6F574
指针实际上就是存储变量位置的变量。当访问由a的地址确定的指针变量b的地址时,b将地址直接指向了a的地址。
此处可以理解为,我向宾馆申请了一个int房间,我把房间取名为a,并在该房间存储了内容物数值10,现在宾馆按照我的要求给我分配好了该房间的房间号,这时候我又申请了一个特殊的指针房间为b,随后将a的房间号牌存放到了b房间内,这样我只需要通过一定的指令访问指针房间b,就可以得到a的房间号牌,然后根据房间号牌找到a房间里的内容。
3.操作指针
实例
#include <stdio.h>
int main()
{
int a = 10;
int* b = &a;
*b = 20;
printf("%d\n", a);
return 0;
}
结果
20
我们根据变量a的地址设置了指针b,可以通过*b对指针b进行反解,通过地址直接得到a的位置,随后将新的值存放到a房间内。*b的过程叫做解引用,即通过操作指针直接更改原地址存放变量的值。
以上为指针内容的初级理解。