第14题  设有下面程序

c_choice14-08

则程序执行后的输出结果是

­      A    0,2,

­      B    1,2,

­      C    1,3,

­      D    2,3,

答案  C

程序解析:

考查指针形参的应用。函数通过指针形参可以访问、改变函数外部的变量。在本题中,函数fun通过指针形参a改变main的变量a。

程序从函数main开始执行。声明:

­        int a = 0;

定义整型变量a,分配存储,并初始化为0。至此,当前存储状态如下图所示:

c_choice14-01

下面开始执行main的语句:

首先,执行函数调用语句

­        fun(&a);

以变量a的地址&a为实参调用函数fun,于是,main的执行被挂起(暂停),函数fun开始执行。首先,为形参变量 a分配存储,完成参数传递:将main中的变量a的地址&a的值传值(拷贝)于fun的形参a之中,即让指针a指向main中的变量a,以便通过fun中的指针a来访问main中的变量a。至此,当前存储状态如下图所示。形参a也是fun的局部变量。注意:这里有两个变量a、同名不同型、但不会冲突,因为它们分属不同的函数fun和main、分别存在于不同的存储空间、各有自己的作用域。fun的局部变量只能在fun中访问。

c_choice14-02

在函数fun中,只执行下面的return语句

­        return ++∗a + 1;

计算表达式++∗a + 1的值并返回其调用者main。首先计算表达式++∗a的值,因++和∗的优先级相同且服从自右而左结合,故++∗a等价于++(∗a),即让指针a所指的变量加1,即让main的变量a加1,计算表达式++∗a的效果如下图所示:

c_choice14-03

紧接着,计算表达式++∗a + 1的值得到2,将2返回其调用者main,同时收回fun的存储空间。至此,当前存储状态如下图所示:

c_choice14-04

函数fun返回后,main从挂起点即语句:

­        fun(&a);

恢复继续执行。这是函数调用语句,故fun的返回值2被忽略不用。接着执行语句

­        printf(″%d,″, a);

将a的当前值1输出并紧随其后输出逗号,即输出1,

接着,执行赋值语句

­        a = fun(&a);

再次以变量a的地址&a为实参调用函数fun,于是,main的执行被再次挂起(暂停),函数fun开始执行。首先,为形参变量 a分配存储,完成参数传递:将main中的变量a的地址&a的值传值(拷贝)于fun的形参a之中,即让指针a指向main中的变量a,以便通过fun中的指针a来访问main中的变量a。至此,当前存储状态如下图所示。

c_choice14-05

在函数fun中,只执行下面的return语句

­        return ++∗a + 1;

计算表达式++∗a + 1的值并返回其调用者main。首先计算表达式++∗a的值,即让指针a所指的变量加1,即让main的变量a加1,计算表达式++∗a的效果如下图所示:

c_choice14-06

紧接着,计算表达式++∗a + 1的值得到3,将3返回其调用者main,同时收回fun的存储空间。函数fun返回后,main从挂起点即语句:

­        a = fun(&a);

恢复继续执行,将fun的返回值3赋值于变量a。至此,当前存储状态如下图所示:

c_choice14-07

接着执行语句

­        printf(″%d,″, a);

将a的当前值3输出并紧随其后输出逗号,即输出3,

由于这是main的最后语句,随即函数main执行结束、同时收回其存储空间。

综上,程序输出结果为 1,3,

知识点

① 若p是指针变量,则可利用p直接访问该指针变量,还可利用∗p间接访问p所指向的变量或对象,∗叫做指针间接访问运算符。例如:在本题函数fun中,利用∗a间接访问a所指向的变量,即main的变量a。

② fun(&a); 与 a = fun(&a); 的区别:

前者叫做函数调用语句,忽略函数返回值,即弃之不用。后者叫做赋值语句,其中的fun(&a)叫做函数调用表达式,函数fun的返回值作为函数调用表达式fun(&a)的值参与赋值表达式a = fun(&a)的计算。

在函数调用表达式fun(&a)后面添加分号就变成了函数调用语句,在赋值表达式a = fun(&a)后面添加分号就变成了赋值语句。在任意表达式后面均可添加分号,添加分号后,就变成了语句,叫做表达式语句

练习题

试为自己设计一道孪生题,举一反三。

孪生题  设有下面程序

c_choice14-09

则程序执行后的输出结果是

­      A    0,2,

­      B    1,2,

­      C    1,3,

­      D    2,3,

答案  B

分析:同上完全类似。

返回