程序填空题:变量地址做函数参数
老师想写一个用于交换变量x,y的值的swap 函数。
#include <stdio.h>
void swap(int a, int b);
int main() {
int x;
int y;
x = 20;
y = 16;
printf("x = %d\ny = %d\n", x, y);
swap(x, y);
printf("x = %d\ny = %d\n", x, y);
return 0;
}
void swap(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
执行结果为:

为什么呢?由于在main函数中调用swap时,是将实参x的值复制给了a,将实参y的值复制给了b,swap函数中的形参a和实参x存储在不同的内存地址中,形参b和实参y也存储在不同的内存地址中。
因此swap函数内的a、b的交换并不影响到main函数中x,y的值。所以老师的这个程序并不能按照预期工作。
不知道小伙伴们还记得不?我们学习scanf时,在变量名前要加取地址符&,很多小伙伴忘记,在PTA提交答案的时候系统给出了段错误。为什么呢?
通过取地址符我们可以知道一个变量所对应在内存中的位置。
如果在这里,我们能不直接传入x的值和y的值,而是让函数传它们在内存中的位置,那么我们就可以在函数中对这两个地址进行访问和操作了。
那我们一起来修改下这个代码吧。
第一步:修改main函数中调用swap函数时传递的实际参数。
请将下面代码中调用swap函数时传入的参数x和y改为它们对应的内存地址。(第二个空)
第二步:修改函数声明和函数实现。
传入到swap函数的实际参数从整型变量变成整数型变量的地址,相应的,我们也需要对函数的形参的类型进行变更。
我们可以通过int *p声明一个变量,用来存储整型变量x(已经定义:int x;)的地址值:
int *p;
p=&x;
类似的,为了接收整型变量x和y的地址,swap函数中的形式参数也相应的应该是可以用来存储整型变量地址值的变量。
请将swap函数的形式参数的类型改变一下,让两个形式参数可以接收整数型变量的地址。(在函数的声明和实现部分都要修改)(第一、三空)
第三步:完成swap函数,实现交换实参x,y。
这里我们需要用到取值运算符:它和乘号的写法一致,都是*,但是它用于存储地址的变量前。
比如,对于一个存储整数型变量的的地址的变量p,我们如果希望取出它存储的地址对应的内存的值赋值给另一个变量m,我们可以直接写m=*p;
而如果我们希望将p存储的地址对应的内存的值改为3,我们则可以直接写*p=3;
如果我们不改变变量temp的类型,我们可以在哪些地方增加取值运算符$$*$$用以完成交换传入参数值的任务呢?动手做一做吧。
c++
#include <stdio.h>
void swap(@@[int *a, int *b](1));
int main() {
int x;
int y;
x = 20;
y = 16;
printf("x = %d\ny = %d\n", x, y);
swap(@@[&x, &y](2));
printf("x = %d\ny = %d\n", x, y);
return 0;
}
void swap(@@[int *a, int *b](1)) {
int temp;
temp =@@[ *a](1);
@@[ *a =*b](1);
@@[*b](1) = temp;
}
在编译器里运行下,看看我们的swap函数被调用前后x和y的值是不是被交换了呢?
答案:
第1空:int *a, int *b
第2空:&x, &y
第3空:int *a, int *b
第4空: *a
第5空: *a =*b
第6空:*b
#include <stdio.h>
void swap(int a, int b);
int main() {
int x;
int y;
x = 20;
y = 16;
printf("x = %d\ny = %d\n", x, y);
swap(x, y);
printf("x = %d\ny = %d\n", x, y);
return 0;
}
void swap(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
执行结果为:

为什么呢?由于在main函数中调用swap时,是将实参x的值复制给了a,将实参y的值复制给了b,swap函数中的形参a和实参x存储在不同的内存地址中,形参b和实参y也存储在不同的内存地址中。
因此swap函数内的a、b的交换并不影响到main函数中x,y的值。所以老师的这个程序并不能按照预期工作。
不知道小伙伴们还记得不?我们学习scanf时,在变量名前要加取地址符&,很多小伙伴忘记,在PTA提交答案的时候系统给出了段错误。为什么呢?
通过取地址符我们可以知道一个变量所对应在内存中的位置。
如果在这里,我们能不直接传入x的值和y的值,而是让函数传它们在内存中的位置,那么我们就可以在函数中对这两个地址进行访问和操作了。
那我们一起来修改下这个代码吧。
第一步:修改main函数中调用swap函数时传递的实际参数。
请将下面代码中调用swap函数时传入的参数x和y改为它们对应的内存地址。(第二个空)
第二步:修改函数声明和函数实现。
传入到swap函数的实际参数从整型变量变成整数型变量的地址,相应的,我们也需要对函数的形参的类型进行变更。
我们可以通过int *p声明一个变量,用来存储整型变量x(已经定义:int x;)的地址值:
int *p;
p=&x;
类似的,为了接收整型变量x和y的地址,swap函数中的形式参数也相应的应该是可以用来存储整型变量地址值的变量。
请将swap函数的形式参数的类型改变一下,让两个形式参数可以接收整数型变量的地址。(在函数的声明和实现部分都要修改)(第一、三空)
第三步:完成swap函数,实现交换实参x,y。
这里我们需要用到取值运算符:它和乘号的写法一致,都是*,但是它用于存储地址的变量前。
比如,对于一个存储整数型变量的的地址的变量p,我们如果希望取出它存储的地址对应的内存的值赋值给另一个变量m,我们可以直接写m=*p;
而如果我们希望将p存储的地址对应的内存的值改为3,我们则可以直接写*p=3;
如果我们不改变变量temp的类型,我们可以在哪些地方增加取值运算符$$*$$用以完成交换传入参数值的任务呢?动手做一做吧。
c++
#include <stdio.h>
void swap(@@[int *a, int *b](1));
int main() {
int x;
int y;
x = 20;
y = 16;
printf("x = %d\ny = %d\n", x, y);
swap(@@[&x, &y](2));
printf("x = %d\ny = %d\n", x, y);
return 0;
}
void swap(@@[int *a, int *b](1)) {
int temp;
temp =@@[ *a](1);
@@[ *a =*b](1);
@@[*b](1) = temp;
}
在编译器里运行下,看看我们的swap函数被调用前后x和y的值是不是被交换了呢?
答案:
第1空:int *a, int *b
第2空:&x, &y
第3空:int *a, int *b
第4空: *a
第5空: *a =*b
第6空:*b