29-查找地址_&运算符
9.5 查找地址:&运算符
指针(pointer)是C语言最重要的(有时也是最复杂的)概念之一,用于存储变量的地址。前面使用的 scanf() 函数中就使用地址作为参数。概括地说,如果主调函数不使用 return 返回的值,则必须通过地址才能修改主调函数中的值。接下来,我们将介绍带地址参数的函数。首先介绍一元 & 运算符的用法。
一元 & 运算符给出变量的存储地址。如果 pooh 是变量名,那么 &pooh 是变量的地址。可以把地址看作是变量在内存中的位置。假设有下面的语句:
pooh = 24;
假设 pooh 的存储地址是 0B76 ( PC 地址通常用十六进制形式表示)。那么,下面的语句:
printf("%d %p\n", pooh, &pooh);
将输出如下内容( %p 是输出地址的转换说明):
24 0B76
程序清单9.12中使用了这个运算符查看不同函数中的同名变量分别存储在什么位置。
程序清单9.12 loccheck.c 程序
/* loccheck.c -- 查看变量被存储在何处 */
#include <stdio.h>
void mikado(int); /* 函数原型 */
int main(void)
{
int pooh = 2, bah = 5; /* main()的局部变量 */
printf("In main(), pooh = %d and &pooh = %p\n", pooh, &pooh);
printf("In main(), bah = %d and &bah = %p\n", bah, &bah);
mikado(pooh);
return 0;
}
void mikado(int bah) /* 定义函数 */
{
int pooh = 10; /* mikado()的局部变量 */
printf("In mikado(), pooh = %d and &pooh = %p\n", pooh, &pooh);
printf("In mikado(), bah = %d and &bah = %p\n", bah, &bah);
}
程序清单9.12中使用ANSI C的 %p 格式打印地址。我们的系统输出如下:
In main(), pooh = 2 and &pooh = 0x7fff5fbff8e8
In main(), bah = 5 and &bah = 0x7fff5fbff8e4
In mikado(), pooh = 10 and &pooh = 0x7fff5fbff8b8
In mikado(), bah = 2 and &bah = 0x7fff5fbff8bc
实现不同, %p 表示地址的方式也不同。然而,许多实现都如本例所示,以十六进制显示地址。顺带一提,每个十六进制数对应4位,该例显示12个十六进制数,对应48位地址。
该例的输出说明了什么?首先,两个 pooh 的地址不同,两个 bah 的地址也不同。因此,和前面介绍的一样,计算机把它们看成4个独立的变量。其次,函数调用 mikado(pooh) 把实际参数( main() 中的 pooh )的值( 2 )传递给形式参数( mikado() 中的 bah )。注意,这种传递只传递了值。涉及的两个变量( main() 中的 pooh 和 mikado() 中的 bah )并未改变。
我们强调第2点,是因为这并不是在所有语言中都成立。例如,在FORTRAN中,子例程会影响主调例程的原始变量。子例程的变量名可能与原始变量不同,但是它们的地址相同。但是,在C语言中不是这样。每个C函数都有自己的变量。这样做更可取,因为这样做可以防止原始变量被被调函数中的副作用意外修改。然而,正如下节所述,这也带来了一些麻烦。