第20题  整数二合一1

试编写函数fun,通过int形参a和b分别接收函数main的int变量a和b,通过int指针形参c接收函数main的int变量c的地址。设a、b均为两位正整数,按下面方式把a、b融合为一个正整数,再通过形参指针c把融合结果回送给main的变量c。c的百位和个位是a的十位和个位,c的千位和十位是b的十位和个位。

例如:若a为54, b为21,则融合结果为2514。

注意:部分源程序在PROG1.C中,请勿改动已给定的任何内容,只在函数fun的指定位置填入你编写的若干语句。

PROG1.C:

PROG20-01

参考答案:

PROG20-02

运行结果:

PROG20-03

程序解析:

在函数main执行期间,设main的变量a和b通过语句scanf(″%d%d″, &a, &b);分别读取54和21,再由语句fun(a, b, &c);调用函数fun。在函数fun执行期间,首先把main的变量a和b的当前值54和21分别拷贝到fun的形参变量a和b中,把main的变量c的地址&c拷贝到fun的形参指针变量c中,这就是C函数之间参数传递的唯一方式,称为传值,就是把实参表达式的值拷贝到对应的形参变量之中。本次参数传递完成后(如下图),使得main的变量a、b和fun的形参变量a、b具有相同的值54、21,使得fun的形参指针变量c指向main的变量c(这时c的值还不是2514、而是无意义的垃圾值)。这里出现了同名同型变量a和b,同名不同型的变量c,但它们分属不同的函数、存在于不同的存储空间,彼此不可见、不冲突,如下图所示。需要特别注意的是,在函数fun内,通过对指针c的间接引用,也就是通过∗c这个名字可以存取main的变量c。通过这种方式,被调函数fun就能够把执行结果回送给调用者main,这正是本题的考查要点。

PROG20-04

由于a和b都是两位正整数,a%10可得a的个位数字、a/10可得a的十位数字,这是整数除法操作符%和/的特点。用这种操作把a和b的十位和个位数字分离出来以后,再根据它们与c的个、十、百、千位数字的对应关系,分别乘以各位权值1、10、100、1000,再累加在一起、即得融合结果,这一系列工作全部由一条赋值语句:

∗c = a%10 + 10∗(b%10) + 100∗(a/10) + 1000∗(b/10);

完成,不用任何辅助变量,既紧凑又节省存储空间,正是这个对∗c的赋值才把融合结果2514转储于main的变量c之中。

知识点:

① C函数之间参数传递的唯一方式,称为传值,就是把实参表达式的值拷贝到对应的形参变量之中。

② 通过对指针形参的间接引用(∗叫做间接引用操作符),使得被调函数能够把执行结果回送给调用者。这样,被调函数向调用者函数回送执行结果就有两条途径:return语句和指针形参。

③ 整数除法操作符%和/的含义:%两整数相除取余数;/两整数相除取整商。

例如:54%10等于4;54/10等于5。

④ 同指针形参对应的实参表达式必须是指针,通常是指针变量、数组名、取地址操作符&的操作结果。

例如本题:若a是变量,则&a是变量a的地址,或说是指向a的指针。

练习题:

试改变代码行∗c = a%10 + 10∗(b%10) + 100∗(a/10) + 1000∗(b/10);,为自己命新题,举一反三。

返回