预计阅读本页时间:-
C中最重要的(有时也是最复杂的)概念之一就是指针(pointer),也就是用来存储地址的变量。在上文中函数scanf()就是使用地址作为参数。更一般地,当需要改变调用函数中的某个数值时,任何被调用的无返回值的C函数都需要使用地址参数来完成该任务。接下来我们将讨论使用地址参数的函数,首先介绍一元运算符&的使用方法(下一章继续研究指针并介绍它的使用方法)。
一元运算符&可以取得变量的存储地址。假设pooh是一个变量的名字,那么&pooh就是该变量的地址。一个变量的地址可以被看作是该变量在内存中的位置。假定使用了以下语句:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
并且假定pooh的存储地址是0B76(PC的地址一般以4位十六进制数的形式表示)。那么语句:
将输出如下数值(%p是输出地址的说明符):
在程序清单9.12中,我们使用地址运算符获得不同函数中具有相同名称的变量的存储地址。
程序清单9.12 loccheck.c程序
程序清单9.12使用了ANSI C中的%p格式对地址进行输出。在我们的系统中程序的输出结果如下:
%p输出地址的方式随着实现的不同而有所不同。但是在多数实现中,地址是像本例中这样以十六进制形式显示的。
上述输出结果说明了以下问题:首先,两个pooh变量具有不同的地址,两个bah变量也是如此。因此,正如我们所料,计算机会把它们看作4个独立的变量。其次,函数调用mikado(pooh)确实把实际参数(main()中的pooh)的数值(2)传递给了形式参数(mikado()中的bah)。需要注意的是这种传递只是进行了数值传递,两个变量(main()中的pooh和mikado()中的bah)仍分别保持原来的特性。
我们提出第二点是因为并非所有的语言都如此。例如在FORTRAN语言中,子程序会改变调用程序中的原变量的数值。尽管在子程序中变量的名称可能不同,但是其地址是相同的。而在C语言中并不是这样。每一个C函数都使用自己的变量。这么做更可取,因为它可以使原变量不因被调函数中操作的副作用而意外地被改变。然而,正如下节要讲述的那样,这种做法也会带来一些麻烦。