内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《编程语言基础-C语言》(高教版第5版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《编程语言基础-C语言》(高教版第5版)一课一练的第8章的第46练,内容涵盖第8章 指针的8.5指针作为函数参数。
《编程语言基础-C语言》(高教版第5版)第46练
第8章 指针
8.5 指针作为函数参数(解析版)
一、单项选择题(本题共5小题)
1、若需要在被调函数中修改主调函数中普通变量的值,则函数参数应定义为( )
A. 普通变量
B. 指针变量
C. 全局变量
D. 静态变量
【答案】B
【解析】C语言中函数参数默认是值传递,形参的改变不影响实参。若要在函数内修改实参的值,必须传递变量的地址(即指针),函数内通过解引用修改。
2、以下程序段中,能正确实现两个整型变量值交换的函数是( )
A. void swap(int a, int b) { int t=a; a=b; b=t; }
B. void swap(int *a, int *b) { int t; t=*a; *a=*b; *b=t; }
C. void swap(int *a, int *b) { int *t; t=a; a=b; b=t; }
D. void swap(int a, int b) { int *t; *t=a; a=b; b=*t; }
【答案】B
【解析】通过指针传递地址,在函数内交换指针指向的值,可改变实参。
3、若有函数定义 void modify(int *p, int n),调用该函数使数组 arr 的第一个元素加10,正确的调用是( )
A. modify(arr[0], 10);
B. modify(&arr[0], 10);
C. modify(arr, 10);
D. B和C都正确
【答案】D
【解析】函数期望第一个参数为指向 int 的指针。&arr[0] 是第一个元素的地址,arr 数组名在表达式中退化为首元素地址,两者均可。因此B和C都正确。A传递的是元素值,不是地址。
4、以下程序运行后的输出结果是( )
#include <stdio.h>
void fun(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
main() {
int a = 3, b = 5;
fun(&a, &b);
printf("%d,%d", a, b);
}
A. 3,5
B. 5,3
C. 3,3
D. 5,5
【答案】B
【解析】fun 函数通过指针交换了 a 和 b 的值。调用时传入地址,函数内修改指针所指向的内容,实参 a 和 b 的值被交换,输出 5,3。
5、以下关于指针作为函数参数的描述,错误的是( )
A. 指针作为参数可以实现在函数内部修改外部变量的值
B. 指针作为参数时,实参必须是变量的地址
C. 用指针作为参数可以传递数组,因为数组名就是地址
D. 指针作为参数时,形参的改变会直接改变实参指针的值
【答案】D
【解析】指针作为参数时,实参的地址值复制给形参指针变量(值传递),形参指针的改变(如 p++)不会影响实参指针的值。但通过形参可以修改实参指针所指向的内容。
二、判断题(本题共5小题)
1、使用指针作为函数参数可以实现“双向”的数据传递,即主调函数和被调函数之间可以相互传递数据。( )
【答案】√
【解析】一般函数参数只能从实参单向传给形参。但若传递指针,被调函数可通过指针修改主调函数中的变量,从而实现“双向”传递——主调传地址,被调传回修改后的值。
2、若有函数原型 void swap(int *p1, int *p2);,则调用 swap(&a, &b); 时,实参和形参的结合方式是值传递,传递的是变量的地址值。( )
【答案】√
【解析】C语言中所有参数传递都是值传递。传递指针时,实参把地址值复制给形参,形参得到副本。但通过该地址可访问原变量。因此说法正确。
3、只要函数的参数是指针类型,就一定能修改主调函数中对应变量的值。( )
【答案】×
【解析】不一定。如果指针参数接收的是地址,但函数内没有对该地址指向的内容进行修改,则不能改变实参变量的值。另外,如果指针指向常量或只读区域,也无法修改。
4、传递指针与传递数组名作为参数的效果完全相同,因为在函数内都可以通过下标或指针运算修改原数组元素。( )
【答案】√
【解析】数组名作为实参时,编译器将其转换为首元素地址,函数形参可写为指针或数组形式。通过形参(指针)可修改原数组元素,效果与传递指针一致。因此正确。
5、以下程序段可以正确通过指针参数返回两个整数中的较小值。( )
void getMin(int x, int y, int *min) {
if (x < y) min = &x;
else min = &y;
}
main() {
int a=5, b=3, result;
getMin(a, b, &result);
printf("%d", result);
}
【答案】×
【解析】程序错误。函数内只改变了形参指针 min 的指向,并未将较小值赋给 result。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《编程语言基础-C语言》(高教版第5版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《编程语言基础-C语言》(高教版第5版)一课一练的第8章的第46练,内容涵盖第8章 指针的8.5指针作为函数参数。
《编程语言基础-C语言》(高教版第5版)第46练
第8章 指针
8.5 指针作为函数参数(原卷版)
一、单项选择题(本题共5小题)
1、若需要在被调函数中修改主调函数中普通变量的值,则函数参数应定义为( )
A. 普通变量
B. 指针变量
C. 全局变量
D. 静态变量
2、以下程序段中,能正确实现两个整型变量值交换的函数是( )
A. void swap(int a, int b) { int t=a; a=b; b=t; }
B. void swap(int *a, int *b) { int t; t=*a; *a=*b; *b=t; }
C. void swap(int *a, int *b) { int *t; t=a; a=b; b=t; }
D. void swap(int a, int b) { int *t; *t=a; a=b; b=*t; }
3、若有函数定义 void modify(int *p, int n),调用该函数使数组 arr 的第一个元素加10,正确的调用是( )
A. modify(arr[0], 10);
B. modify(&arr[0], 10);
C. modify(arr, 10);
D. B和C都正确
4、以下程序运行后的输出结果是( )
#include <stdio.h>
void fun(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
main() {
int a = 3, b = 5;
fun(&a, &b);
printf("%d,%d", a, b);
}
A. 3,5
B. 5,3
C. 3,3
D. 5,5
5、以下关于指针作为函数参数的描述,错误的是( )
A. 指针作为参数可以实现在函数内部修改外部变量的值
B. 指针作为参数时,实参必须是变量的地址
C. 用指针作为参数可以传递数组,因为数组名就是地址
D. 指针作为参数时,形参的改变会直接改变实参指针的值
二、判断题(本题共5小题)
1、使用指针作为函数参数可以实现“双向”的数据传递,即主调函数和被调函数之间可以相互传递数据。( )
2、若有函数原型 void swap(int *p1, int *p2);,则调用 swap(&a, &b); 时,实参和形参的结合方式是值传递,传递的是变量的地址值。( )
3、只要函数的参数是指针类型,就一定能修改主调函数中对应变量的值。( )
4、传递指针与传递数组名作为参数的效果完全相同,因为在函数内都可以通过下标或指针运算修改原数组元素。( )
5、以下程序段可以正确通过指针参数返回两个整数中的较小值。( )
void getMin(int x, int y, int *min) {
if (x < y) min = &x;
else min = &y;
}
main() {
int a=5, b=3, result;
getMin(a, b, &result);
printf("%d", result);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$