指针概述

要讲述指针,首先要讲到数据在内存中的存储方式。在C编译系统中,系统为整形数据分配4字节内存空间,为字符型数据分配1字节内存空间。而内存区每个字节都有一个编号,这个编号就是这个字节的地址。由于通过地址可以找到存放这个变量的位置,所以说这个地址指向这个变量,通常我们称这个地址是变量的指针。 例如我们有如下代码:

int  a = 5;

变量a在内存中的存放情况示意图如下:

其中,这个变量占用4个字节的内存空间,如果有下一个变量被声明,地址号则是从2004开始。地址不一定是从2000开始,这里只是示意。如果我们声明了一个整型数组,则可以更好地理解整形数据占用4个字节的问题:

int  a[4] = {1, 2, 3, 4};
地址 变量名 变量内容
2000 a[0] 1
2004 a[1] 2
2008 a[2] 3
2012 a[3] 4

当我们用scanf输入数据的时候需要用到’&’取地址符,例如:

int  a;
scanf(“%d” , &a);

这个时候,系统将键盘输入的值送入a的地址指向的内存单元。如果有语句通过变量名直接调用这个变量,这叫做变量的“直接访问”。如果通过地址来访问变量的内容,这就叫做“间接访问”,这个时候就需要用到指针变量。 我们在C语言中定义过很多类型的变量,例如整形、浮点型、字符型,还有一种特殊的变量类型可以用来存放其他变量的地址,叫做指针变量,标识符是一个星号(*)。例如有指针变量p,我们通过如下语句将变量a的地址存放给p:

p = &a;

这个时候变量a与p在内存中的关系如下图:

可以看到,p本身是一个变量,它存放的内容是a的地址,p的内容指向变量a。这个时候称p是指向a的指针变量。这样看来,指针变量就是可以存放其他变量地址的变量。

这本书是xt写的上次修改: 2019-04-18 15:36:44

results matching ""

    No results matching ""