8.1什么是指针

指针是C语言中一个重要概念,也是C语言一个重要特色 。正确而灵活的运用指针,可以使程序简洁、紧凑、高效 。可以说,没掌握指针就没有掌握C语言的精华 。
指针的概念比较复杂,使用也比较灵活,因此在学习时要十分小心,多思考、多比较、多上机,在实践中掌握它 。
为了说清楚什么是指针,必须先弄清楚数据在内存中时如何存储的,又是如何读取的 。
(一)地址与指针
1.数据在内存中的存储
如果在程序中定义了一个变量,在对程序进行编译的时候,系统会给这个变量分配内存单元 。怎么分配呢?
计算机内存可划分为若干存储单元,每个单元一个字节;内存单元采用线性地址编码,每个单元具有唯一一个地址编码 。
系统给变量分配存储空间的过程,可用酒店给旅客安排房间类比 。如果把酒店类比为编译系统,则旅客为变量的值,酒店的房间可比喻为内存空间 。

8.1什么是指针

文章插图
旅客预定房间,酒店会根据旅客特点要求安排合适的房间,旅客通过房间号找到自己所住的房间 。
在计算机中,如果在程序中定义了一个变量,那么在编译程序时,系统会给这个变量分配内存单元 。
究竟怎么分配呢?
如为整型变量安排四个字节,浮点型变量安排4个字节,字符变量则分配一个字节 。上面讲到内存区每一个字节都有一个编号,这就是地址,它相当于酒店的房间号 。地址所指向的内存中存放的数据,则相当于酒店房间中居住的旅客 。
由于地址可以找到所需的变量,可以说,地址指向了该变量的存储单元 。
打个比方说,某房间门口挂了房间号2021,这个2021就是房间的地址,或者说2021“指向”该房间 。因此,我们将地址形象化的称为“指针”,意思是通过它能找到以它为地址的内容单元 。
2.数据的读取
注意要弄清楚存储单元的地址和存储单元的内容这两个概念的区别 。一个是房间号,一个是房间里的旅客 。在程序中一般是通过变量名来引用变量的值,例如
Printf("%dn",i);
由于在编译时,系统已为变量i分配了按整型存储方式的4个字节,并建立了变量名和地址的对应表,因此在执行上面语句时,首先通过变量名找到相应的地址,从该4个字节中按照整形数据的存储方式读出整型变量i的值,然后按十进制整数格式输出 。
注意:对变量的访问都是通过地址进行的 。
如有输入语句
Scanf("%d",&i);
在执行时,把键盘输入的值送到地址为2000开始的整型存储单元中 。
这种直接按变量名进行的访问,称为直接访问方式 。
还有一种方式则是将变量i的地址存放在另一变量中,然后通过该变量来找到变量i的地址(2000),从而访问i变量 。
在C语言中,可以定义一种特殊的变量,用它来存放地址 。假设定义了一个变量p,用来存放整型变量的地址,可以通过下面语句将i的地址存放到p中 。
p=&i;//将i的地址存放到p中
这是p的值就是2000(即变量i所占单元的其实地址)
仍以酒店打比方,
A、B、C三人同租用某酒店房间,A先到酒店,在服务台登记房间,房间号是2022,然后A电话通知了B,但没有通知C 。
B和C给该如何找到A呢?
(1)B可以直接到2022房间找到A 。这是一种直接访问 。
(2)C可从酒店服务台查询到A的房间2022,再找到A,这就是间接访问 。
8.1什么是指针

文章插图
图a表示直接访问,根据变量名直接向变量i赋值,由于变量名与变量的地址有一一对应的关系,因此就按此地址直接对变量i的存储单元进行访问(如把数值33存放到变量i的存储单元 。)
图b表示间接访问,先找到存放变量i地址的变量p,从其中得到变量i的地址(2000),从而找到变量i的存储单元,然后对它进行存取访问 。
(二)指针变量
指向就是通过地址来体现的 。假设p的值是变量i的地址,这样就在p和变量i之间建立起一种联系,即通过p能知道i的地址,从而找到变量的内存单元 。图b中以单箭头表示这种“指向”关系 。
由于通过地址能够找到所需的变量单元,因此说,地址指向该变量单元,如同说,一个房间号指向某个房间一样 。将地址形象化地称为“指针” 。意思是通过指针能找到以指针值为地址的内存单元 。
如果有一个变量专门用来存放另一个变量的i地址,则它称为“指针变量” 。上述p就是一个指针变量 。指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针) 。