printf 地址_C语言查找内存地址的&运算符

db938cc7669c4d1a9bd087d51043bd29.png

指针(pointer)是C语言最重要的(有时也是最复杂的)概念之一,用于存储变量的地址。前面使用的scanf()函数中就使用地址作为参数。概括地说,如果主调函数不使用return返回的值,则必须通过地址才能修改主调函数中的值。接下来,我们将介绍带地址参数的函数。首先介绍一元&运算符的用法。

一元&运算符给出变量的存储地址。如果pooh是变量名,那么&pooh是变量的地址。可以把地址看作是变量在内存中的位置。假设有下面的语句:

pooh = 24;

假设pooh的存储地址是0B76(PC地址通常用十六进制形式表示)。那么,下面的语句:

printf("%d %pn", pooh, &pooh);

将输出如下内容(%p是输出地址的转换说明):

24 0B76

下列程序使用了这个运算符查看不同函数中的同名变量分别存储在什么位置。

/* loccheck.c  -- checks to see where variables are stored  */#include void mikado(int);                      /* declare function  */int main(void){    int pooh = 2, bah = 5;             /* local to main()   */    printf("In main(), pooh = %d and &pooh = %p",            pooh, &pooh);    printf("In main(), bah = %d and &bah = %p",            bah, &bah);    mikado(pooh);    return 0;}void mikado(int bah)                   /* define function   */{    int pooh = 10;                     /* local to mikado() */    printf("In mikado(), pooh = %d and &pooh = %p",            pooh, &pooh);    printf("In mikado(), bah = %d and &bah = %p",            bah, &bah);}

程序清单9.12中使用ANSI C的%p格式打印地址。我们的系统输出如下:

In main(), pooh = 2 and &pooh = 0x7fff5fbff8e8In main(), bah = 5 and &bah = 0x7fff5fbff8e4In mikado(), pooh = 10 and &pooh = 0x7fff5fbff8b8In 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点,是因为这并不是在所有语言中都成立。例如,在某些语言中,子例程会影响主调例程的原始变量。子例程的变量名可能与原始变量不同,但是它们的地址相同。但是,在C语言中不是这样。每个C函数都有自己的变量。这样做更可取,因为这样做可以防止原始变量被被调函数中的副作用意外修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值