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节将专门介绍这两个函数的使用。