C

C 知识量:16 - 74 - 317

9.5 变量地址><

&运算符- 9.5.1 -

一元&运算符用于给出变量的存储地址,例如:如果number是变量,&number就是变量的地址。可以将地址看作是变量在内存中的位置。

在scanf()函数中就使用地址作为参数。一般情况下,如果主调函数不使用被调用函数return语句返回的值来修改自身变量的值,则必须通过地址才能修改主调函数中的值。

示例:&运算符的使用。

#include <stdio.h>

int main(void) {
    int number;
    printf("Please enter an integer (q to quit):\n");
    while (scanf("%d", &number) == 1) {
        printf("The number is %d,and &number is %p.\n", number, &number);
        printf("Please enter an integer (q to quit):\n");
    }
    printf("Done.\n");
    system("pause");
    return 0;
}

运行结果为:

Please enter an integer (q to quit):
6
The number is 6,and &number is 0061ff2c.
Please enter an integer (q to quit):
12
The number is 12,and &number is 0061ff2c.
Please enter an integer (q to quit):
365
The number is 365,and &number is 0061ff2c.
Please enter an integer (q to quit):
q
Done.

以上代码中,%p是输出地址的转换说明。

修改主调函数中的变量- 9.5.2 -

有时需要在一个函数中更改其他函数的变量,比如在调用函数中修改main()函数的变量值。以下是一个示例:交换变量x和y的值,基本的思路是:

temp = x;
x = y;
y = temp;

思路的逻辑是正确的,但是如果不借助其他方法,是很难在一个被调函数中,修改主调函数中的变量的。

#include <stdio.h>

void change(int, int);//函数原型

int main(void) {
    int x = 30;
    int y = 100;
    printf("First,x=%d and y=%d\n", x, y);
    change(x, y);//调用函数
    printf("In function main,after change,x=%d and y=%d\n", x, y);
    printf("Done.\n");
    system("pause");
    return 0;
}

//函数定义
void change(int x, int y) {
    int temp;
    temp = x;
    x = y;
    y = temp;
    printf("In function change,after change,x=%d and y=%d\n", x, y);
}

运行结果为:

First,x=30 and y=100
In function change,after change,x=100 and y=30
In function main,after change,x=30 and y=100
Done.

由上述结果可见,虽然在调用函数中成功的完成了变量值的交换,但是main()函数中的变量值却没变,因为,main()与change()中的变量x和y根本就不是同一个变量。而如果使用return语句可以返回单个变量来修改main()函数中x或y的值,但没法同时修改它们两个,如果要实现这个目标,就需要使用指针,即直接使用变量的地址来修改变量。