21天学通C语言
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2.5 地址操作符和指针操作符

变量被定义后,都会占用一块内存,而内存都是有地址的。由于一个变量可用以表示其内存空间,因此,变量内存地址也可以直接称为变量的地址。C语言提供了地址操作符(&)来获取变量(内存)的地址,同时,还提供了指针操作符(*)来获取某地址上的内存内容。

1.地址操作符(&)

要获取一个变量的地址,在该变量名前加&即可,以图3-3中的变量data为例,其地址为0016。要获取其地址值,可以使用“&data”,它的结果即为0016。此外,地址操作符只能使用变量作为操作数,不能将其用在常量前面,比如:

        &14
        &'c'

这种用法是错误的。

2.指针操作符(*)

要取得一个地址中的内容,可以使用指针操作符(*)。指针操作符的操作对象必须为地址,例如:

        *(&data)

其中,&data是data的地址,在前面加指针操作符即可获得该地址上的存储内容。指针操作符使用的对象只能为变量地址。以下的用法是错误的:

        01  int p = 2;
        02  int q = &p;           /* 正确,q为p的地址,但会有警告 */
        03  int z = *q;           /* 错误,这里的q被认为是int型,不是变量地址 */

提示:C语言定义了一种数据类型,专门用来描述变量的地址,即指针类型。它是C语言的关键知识点,在后面将单独使用一章的篇幅专门讨论。

【范例3-6】展示如何使用地址操作符和指针操作符,实现方法如示例代码3-6所示。

示例代码3-6

        01  #include <stdio.h>
        02
        03  int main(void) {
        04       int key = 0;                               /* 定义变量key */
        05
        06       printf("Please input a integer:");
        07       scanf("%d", &key);                         /* 为key赋值 */
        08       printf("key\t= %d\n", key);                /* 输出key的值 */
        09
        10       printf("&key\t= %p\n", &key);              /* 输出key的地址 */
        11       printf("*(&key)\t= %d\n", *(&key));        /* 再次输出key的值 */
        12
        13       return 0;
        14  }

【运行结果】程序运行后,得到结果如图3-6所示。

图3-6 地址操作符和指针操作符

【代码解析】本程序定义了一个变量key,为其赋值后,依次输出它的值、地址,以及它的地址值指向的内存空间上的内容。

· 第8行,使用printf函数打印变量key的值。其中,printf函数中的'\t'输出时相当于一个tab键,其目的是为了对齐输出的结果,效果可参见输出结果。

· 第10行,在变量key之前使用&可以获得变量key的地址,将其传给printf函数,便可以向屏幕输出key的地址值。

由于在本书中所举的范例中,会频繁使用printf函数和scanf函数,因此,在3.3节将专门介绍这两个函数的使用。