目录
八、指针(基础)
8.1 如何产生地址?
8.2 地址的使用
8.2.1 取地址
8.2.2 指针变量
8.2.3 使用(基础)
8.3 指针的大小
八、指针(基础)
引:通常买电脑时,配置中有32位/64位,以及内存4G/8G/32G...而如此大的内存又是如何使用的呢?正如在一个大区域找到某个小地方,我们需要知道的是那个地方的地址编号,再通过地址编号找到该地方。同理,编程中的数据需要一块小空间来存储,这块空间的编号就也称为地址,也指针就是地址。
如图8_1 :
8.1 如何产生地址?
我们这里用32位处理器来解说。32位处理器中就有32条地址线(物理的线),当接通电源后,每条线都会有电信号,产生1、0信号(正电为1,负电为0),这样32条线就能够产生2的32次方个二进制数,这些二进制数编号就是每一个内存单元的地址(补:规定,内存单元的单位为字节)。通常的,我们见到的地址编号都是由八个十六进制数组成,毕竟32个二进制数太多了。
同理,64位处理器自行理解。
如图8_2,32位所产生的二进制序列:
8.2 地址的使用
8.2.1 取地址
在学习变量时,我们知道,当创建变量时,实际上就是申请一块内存空间来存储变量信息,那么,怎样才能知道我们创建的变量其中数据存储的地址呢?下面我们来介绍取地址操作。
代码8_1取出变量的储存地址:
#includeint main() { int b = 9;//创建变量b,并初始化为9 printf("%p", &b); return 0; }
说明:
(1)代码8_1即实现了取出并打印变量b存储数据的地址;
(2)%p,地址的打印类型,使用与%d相似,同时与取地址操作符&一同使用;
(3)打印所得地址表示为八个十六进制数,图8_3:
(4)变量b为整型数据类型,所以为四个字节大小,而打印地址时,我们打印的是第一个单位空间(字节)的地址,即通过第一个地址可找到其他三个单位空间的地址,图8_4:
补:变量的存储地址也可以在编译程序的内存管理中查看。
8.2.2 指针变量
定义:用来存放地址的变量。
代码8_2,指针变量:
#includeint main() { int b = 9;//创建变量b,并初始化为9 printf("%p", &b); int * pb = &b; scanf("%p",pb); return 0; }
说明:
(1)创建指针变量a,来存储变量b的地址,图8_5:
(2)指针变量的数据类型为 int *,其中int表示pb指向对象b中元素的数据类型,*号表示a为指针变量;
(3)同理,如果有char ch='A',那么指向ch地址的指针变量的数据类型为char* ;
8.2.3 使用(基础)
我们知道指针变量是指向某一变量的地址的,那么,我们就可以通过指针变量,找到该变量的地址,从而操作该地址所存储的变量。这时,需要使用要解引用操作符*了,如下,
代码8_3:
#includeint main() { int b = 9;//创建变量b,并初始化为9 printf("%pn", &b);//打印地址 int* pb = &b;//创建指针变量pb,并指向b的地址 printf("%pn", pb);//打印地址 *pb = 81;//通过pb中的地址找到b的地址,并将该地址数据改为81 printf("%d", *pb); return 0; }
图8_6,运行结果:
说明:
解引用操作符*,对pb进行解引用操作找到所指向对象b的地址,同时可操作该地址;
图解:
int b=9 =>假设b的储存地址为0000000A int* pb=&b =>pb=0000000A *pb=81 =>通过对pb解引用找到b的地址,并使b=81
8.3 指针的大小
对指针有了初步了解后,现在我们来看指针的大小。与计算数据类型的大小相同,计算指针大小同样可以使用关键字sizeof,代码8_4:
#includeint main() { printf("%dn", sizeof(char*)); printf("%dn", sizeof(short*)); printf("%dn", sizeof(int*)); printf("%dn", sizeof(long*)); printf("%dn", sizeof(long long*)); printf("%dn", sizeof(float*)); printf("%dn", sizeof(double*)); return 0; }
得到运行结果,图8_6:
可以看到,指针的大小都是相同的。
说明:
我们知道,指针存储的地址,所以指针的大小取决于地址的大小;而前面提过,地址的产生即32条地址线通电后所产生的由1、0组成的有序二进制数,那么,在32位处理器上,地址有32个数,当每个数用一个bit位来存储时,就有32个bit位(4个字节)来存储,所以地址的大小为4个字节,可知地址的大小与其所存储的数据类型无关。
同理可知,在64位处理器中,地址的大小就是64个bit位,也就是8个字节。



