天天看点

指针基础(day2)

1.为什么会有指针?

我们在描述一座宾馆里的客人时,经常会用该客人入住的房间号来代指该客人,比如301室,302室等等。这样前台只需要在抽屉里保存客人入住的房间牌号,在寻找该客人时,只需要打开抽屉,拿出牌号,根据牌号的信息就能在宾馆里找到该客人。

同样的,对于计算机,所有的程序都要在内存中运行,而内存的容量显然是有限的。以32位系统的计算机为例,理论上,该系统最大支持存储2的32次方个bit位,也就是4gb内存。

为了有效地使用珍贵的内存资源,我们将计算机的内存按照如下方式划分:

指针基础(day2)

我们将内存划分成单个的单元,为了能够访问每一个单元,我们需要对这些划分好的单元进行编号,正如对宾馆的房间进行编号一样。这些编号就是内存单元的地址。

实例

#include <stdio.h>

int main()

{

   int num = 10;

   &num;                             //取出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的过程叫做解引用,即通过操作指针直接更改原地址存放变量的值。

以上为指针内容的初级理解。