第46练 第8章 用数组名作函数参数《C语言程序设计》(电子工业出版社)一课一练
|
2份
|
7页
|
32人阅读
|
0人下载
内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(电子工业出版社)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(电子工业出版社)一课一练的第8章的第46练,内容涵盖第8章指针的8.5 用数组名作函数参数。
《C语言程序设计》(电子工业出版社)一课一练 第46练
第8章 指针
8.5 用数组名作函数参数
1、 单项选择题(本题共4小题)
1、当用数组名作函数实参时,传递给形参的是( )
A. 数组的首地址
B. 数组中第一个元素的值
C. 整个数组的所有元素值
D. 数组元素的个数
【答案】A
【解析】数组名本质是数组的首地址,作为实参传递时,形参接收的是这个地址,因此形参和实参指向同一块内存空间,修改形参指向的元素会影响实参数组,选项A 正确,其他选项不符合数组名传参的本质。
2、下列关于函数实参和形参对应关系的描述中,错误的是( )
A. 实参为数组名,形参为数组名
B. 实参为指针变量,形参为指针变量
C. 实参为数组名,形参为普通变量
D. 实参为指针变量,形参为数组名
【答案】C
【解析】数组名传递的是地址,形参必须是能接收地址的类型(数组名或指针变量),普通变量无法接收地址,因此这种对应关系不合法;其他三种都是符合规则的对应方式。
3、若用指针变量作为函数实参,下列操作正确的是( )
A. 直接将未初始化的指针变量作为实参传递
B. 先让指针变量指向一个已定义的数组,再作为实参传递
C. 将指针变量的值直接赋值为数组元素的值后传递
D. 将指针变量定义为全局变量即可直接传递
【答案】B
【解析】指针变量做实参时,必须指向有效的内存空间(比如已定义的数组),否则函数中访问指针会导致程序错误;选项 A 未初始化的指针指向未知内存,选项 C 赋值元素值而非地址,选项 D 全局指针也需要初始化指向有效空间,只有 B 正确。
4、已知主函数中有数组int arr[5] = {1,2,3,4,5};,调用函数void modify(int *x){*x = 10;}时,实参为arr,则主函数中arr[0]的值变为( )
A. 10
B. 1
C. 2
D. 不确定
【答案】A
【解析】实参arr传递数组首地址给形参指针x,*x指向arr[0],修改*x的值就是修改arr[0]的值,因此arr[0]会变为 10,选项 A 正确。
2、 判断题(本题共3题)
1、用数组名作函数实参时,是将数组的所有元素值复制一份传递给形参,因此函数中修改形参数组不会影响实参数组。( )
【答案】×
【解析】数组名作实参传递的是数组首地址,形参和实参指向同一块内存,函数中修改形参数组的元素会直接影响实参数组,并非复制元素值,因此该表述错误。
2、函数形参为数组名时,必须指定数组的所有维度大小,否则编译器会报错。( )
【答案】×
【解析】形参数组可以省略第一维的大小,因为编译器只需要第二维(列数)来计算元素地址,比如void func(int arr[][5])是合法的写法,因此该表述错误。
3、如果用指针变量作为函数实参,必须先让指针变量指向一个已定义的数组或有效的内存空间,否则函数中访问指针会导致程序异常。( )
【答案】√
【解析】未指向有效空间的指针是野指针,访问野指针会导致内存访问错误,因此指针做实参前必须初始化指向合法内存,该表述符合指针使用规则。
3、 填空题(本题共2题)
1、当需要在函数中修改实参数组的元素值时,实参与形参的对应关系有 4 种,其中一种是____,形参为指针变量。
【答案】实参为数组名
【解析】数组名本质是地址,传递给指针形参后,形参可以通过指针访问并修改数组元素。这种对应方式是最常用的数组传参形式之一,能实现对实参数组的修改操作。
2、数组名作为函数参数时,编译器会自动将形参数组处理为____类型,因此形参数组和指针变量在函数中是等价的。
【答案】指向数组元素的指针变量
【解析】数组名传递的是首地址,形参数组接收后会被转换为指针变量,因此在函数中使用形参数组名和使用指针变量的效果完全一致,比如arr[i]等价于*(arr+i)。
4、 读程序写结果题(本题共1题)
1、阅读下面的 C 语言程序,写出程序运行后的输出结果。
【程序代码】
#include <stdio.h>
void add_one(int *x, int n) {
for(int i=0; i<n; i++) {
*(x+i) += 1;
}
}
int main() {
int nums[3] = {1,2,3};
add_one(nums, 3);
for(int i=0; i<3; i++) {
printf("%d ", nums[i]);
}
return 0;
}
【答案】
程序运行结果:
2 3 4
【解析】
实参nums传递数组首地址给形参指针x,函数add_one通过*(x+i)遍历数组元素,每个元素加 1。由于形参和实参指向同一块内存,主函数中nums数组的元素值被修改,因此输出加 1 后的结果。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(电子工业出版社)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(电子工业出版社)一课一练的第8章的第46练,内容涵盖第8章指针的8.5 用数组名作函数参数。
《C语言程序设计》(电子工业出版社)一课一练 第46练
第8章 指针
8.5 用数组名作函数参数
1、 单项选择题(本题共4小题)
1、当用数组名作函数实参时,传递给形参的是( )
A. 数组的首地址
B. 数组中第一个元素的值
C. 整个数组的所有元素值
D. 数组元素的个数
2、下列关于函数实参和形参对应关系的描述中,错误的是( )
A. 实参为数组名,形参为数组名
B. 实参为指针变量,形参为指针变量
C. 实参为数组名,形参为普通变量
D. 实参为指针变量,形参为数组名
3、若用指针变量作为函数实参,下列操作正确的是( )
A. 直接将未初始化的指针变量作为实参传递
B. 先让指针变量指向一个已定义的数组,再作为实参传递
C. 将指针变量的值直接赋值为数组元素的值后传递
D. 将指针变量定义为全局变量即可直接传递
4、已知主函数中有数组int arr[5] = {1,2,3,4,5};,调用函数void modify(int *x){*x = 10;}时,实参为arr,则主函数中arr[0]的值变为( )
A. 10
B. 1
C. 2
D. 不确定
2、 判断题(本题共3题)
1、用数组名作函数实参时,是将数组的所有元素值复制一份传递给形参,因此函数中修改形参数组不会影响实参数组。( )
2、函数形参为数组名时,必须指定数组的所有维度大小,否则编译器会报错。( )
3、如果用指针变量作为函数实参,必须先让指针变量指向一个已定义的数组或有效的内存空间,否则函数中访问指针会导致程序异常。( )
3、 填空题(本题共2题)
1、当需要在函数中修改实参数组的元素值时,实参与形参的对应关系有 4 种,其中一种是____,形参为指针变量。
2、数组名作为函数参数时,编译器会自动将形参数组处理为____类型,因此形参数组和指针变量在函数中是等价的。
4、 读程序写结果题(本题共1题)
1、阅读下面的 C 语言程序,写出程序运行后的输出结果。
【程序代码】
#include <stdio.h>
void add_one(int *x, int n) {
for(int i=0; i<n; i++) {
*(x+i) += 1;
}
}
int main() {
int nums[3] = {1,2,3};
add_one(nums, 3);
for(int i=0; i<3; i++) {
printf("%d ", nums[i]);
}
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$