《编程语言基础-C语言》(高教版第5版)期末复习卷(二)(山东版)

2026-03-16
| 2份
| 18页
| 59人阅读
| 0人下载

资源信息

学段 中职
学科 职教专业课
课程 C语言程序设计
教材版本 C语言程序设计高教版(第五版)全一册
年级 高一
章节 第2章 基本数据类型与简单程序设计,第5章 数组,第6章 函数
类型 题集-专项训练
知识点 数据类型和简单程序设计,分支结构,循环结构,数组,函数
使用场景 同步教学-期末
学年 2026-2027
地区(省份) 山东省
地区(市) -
地区(区县) -
文件格式 ZIP
文件大小 145 KB
发布时间 2026-03-16
更新时间 2026-03-16
作者 xkw_063129603
品牌系列 学易金卷·期末模拟卷
审核时间 2026-03-16
下载链接 https://m.zxxk.com/soft/56844891.html
价格 3.00储值(1储值=1元)
来源 学科网

内容正文:

《编程语言基础——C语言》(高教版第5版) 期末复习卷(二)解析版 时间:90分钟 总分:100分 班级 姓名 学号 成绩 一、单项选择题(本题共20小题,每小题2分,共40分) 1、以下选项中,全部为合法的C语言标识符是( ) A. Int enum _123 B. 2_ab printf abc C. _123 If A D.a&b 0a1 LONG 【答案】C 【解析】 标识符只能由字母、数字和下划线组成,且不能以数字开头,不能是关键字。A中enum是关键字,B中2_ab以数字开头,D中a&b含有非法字符“&”,0a1以数字开头。 2、若有定义:int a=3, b=4; 则表达式 (a++) + (++b) 的值是( ) A. 7 B. 8 C.9 D.10 【答案】B 【解析】 a++ 先使用a的值3再自增,++b 先自增b为5再使用,结果为3+5=8,之后a变为4。 3、若有定义:int x=5; 则执行 x += x -= x * x; 后x的值是( ) A. 20 B. -20 C.-40 D.40 【答案】C 【解析】赋值运算符右结合,先算x*x=25,x-=25得x=-20,再x+=(-20)得x=-40。 4、若有定义:int x = 2, y = 3, z = 4; 则执行下列语句后,变量 x 的值是( ) x = (y += 2) > (z -= 1) ? (x = y + z) : (y = z - x); A. 5 B. 6 C.7 D.8 【答案】D 【解析】 首先计算条件表达式中的第一个子表达式:(y += 2) 使 y 变为 5;(z -= 1) 使 z 变为 3。比较 5 > 3 为真,因此执行第一个分支 (x = y + z)。此时 y 为 5,z 为 3,计算 y + z = 8,并将 8 赋值给 x,该分支表达式的值为 8。整个条件表达式的值为 8,最后执行外层赋值 x = 8,将 8 赋给 x。 5、为避免在嵌套的条件语句if-else中产生二义性,C语言规定:else子句总是与( )配对。 A.缩排位置相同的if B.其之前最近的if C.其之后最近的if D.同一行上的 if 【答案】B 【解析】在嵌套的if语句中,else与其上最近的if配对,除非用括号来改变。 6、以下程序的输出结果是( ) main() { int a=5,b=4,c=3; if(a>b>c) printf("yes"); else printf("no"); } A. yes B. no C.编译错误 D.运行错误 【答案】B 【解析】 a>b为1,再比较1>c(即1>3)为假,输出no。 7、假定a和b为int型变量,则执行以下语句后b的值为( )。 a = 1; b = 10; do { b - = a; a ++; } while (b-- < 0); A.9 B.–2 C.–1 D.8 【答案】D 【解析】b的初值为10,进入循环,先执行b-=a,b的值变为9,循环结束,判断循环条件b--<0即9<0为假,循环结束,同时执行后自减后b的值变为8。 8、阅读以下 C 语言代码片段,请问程序运行后输出的结果是什么( ) #include <stdio.h> main() { int i; for (i = 0; i < 3; printf("%d ", i), i++); } A. 0 1 2 B. 1 2 3 C. 0 1 2 3 D. 1 2 【答案】A 【解析】i的取值:0,1,2,当i的值为3时,先判断表达式i<3,为假,循环结束,不再执行表达式3:printf("%d ", i), i++,所以只输出0 1 2。 9、下列关于 C 语言 for 循环的描述中,错误的是哪一项( ) A. for(;;) 是一个合法的无限循环写法。 B. for 循环的三个表达式(初始化、条件、更新)都可以省略,但两个分号;不能省略。 C. 在 for(int i=0, j=10; i<j; i++, j--) 中,初始化部分和更新部分使用了逗号表达式,这是合法的。 D.for循环的条件表达式如果省略,默认视为条件为假(false),循环一次都不会执行。 【答案】D 【解析】在C语言中,如果for循环的条件表达式省略,编译器会默认该条件为真,从而导致无限循环,而不是视为假。如果要让循环不执行,条件表达式必须明确写出一个为假的值。 10、阅读以下代码,请问 printf 输出的结果是多少( ) main() { int arr[5] = {10, 20}; int sum = 0; for (int i = 0; i < 5; i++) { sum += arr[i]; } printf("%d", sum); } A. 30 B. 10 C. 0 D.不确定的值 【答案】A 【解析】当数组初始化列表中的元素个数少于数组定义的总长度时,剩余的元素会自动初始化为 0。arr[0] = 10,arr[1] = 20,arr[2], arr[3], arr[4] 自动补零。因此sum = 10 + 20 + 0 + 0 + 0 = 30。 11、关于二维数组 int a[3][4]; 的内存存储顺序,下列说法正确的是( ) A. 按列优先存储,即先存 a[0][0], a[1][0], a[2][0]... B. 按行优先存储,即先存 a[0][0], a[0][1], a[0][2], a[0][3], 然后是 a[1][0]... C. 内存地址是随机分配的,没有固定顺序。 D. 编译器可以自由选择按行或按列存储,取决于优化选项。 【答案】B 【解析】C语言采用行优先的方式来存储二维数组,即先在内存中顺序存储第一行的元素,再存放第二行的元素,以此类推。 12、阅读以下代码,程序的输出结果是( ) include main() { int matrix[2][3] = {{1, 2},{3, 4, 5}}; printf("%d %d", matrix[0][2], matrix[1][2]); } A. 0 5 B. 2 5 C. 0 0 D. 编译错误 【答案】A 【解析】第一行部分定义,三个元素matrix[0][0]=1, matrix[0][1]=2,matrix[0][2]=0。 第二行全部定义,三个元素matrix[1][0]=3,matrix[1][1]=4,matrix[1][2]=5。 13、下列关于字符数组初始化的代码中,哪一个是错误的或者会导致未定义行为( ) A. char str1[] = "Hello"; B. char str2[6] = "Hello"; C. char str3[5] = "Hello"; D. char str4[] = {'H', 'e', 'l', 'l', 'o', '0'}; 【答案】C 【解析】字符串 "Hello" 实际需要 6 个字节(5个字母 + 1个结束符 0)。数组str3大小只定义了 5。 14、阅读以下代码,输出结果是( ) #include<stdio.h> #include<string.h> main() { char s1[] = "China"; char s2[10] = "Beijing"; s1[0] = 'c'; s2[0] = 'b'; printf("%d %d", strlen(s1), sizeof(s1)); } A. 5 5 B. 5 6 C. 6 6 D. 4 5 【答案】B 【解析】strlen(s1):计算字符串的有效长度,不包括末尾的 0。s1 内容是 "China",长度为 5。修改 s1[0] 为 'c' 变成 "china",长度依然是 5。 sizeof(s1):计算数组在内存中占用的总字节数。s1 定义为 char s1[] = "China";,编译器分配的空间是 5 个字符 + 1 个 0 = 6 个字节。 15、以下关于函数的叙述中,正确的是( ) A. 每个函数都可以被单独编译 B. 所有函数都是平行的,函数间可以嵌套定义 C. 函数调用时,实参和形参共用内存单元 D. 函数必须要有返回值 【答案】A 【解析】 C语言中函数是独立的,可以单独编译,但函数不能嵌套定义;实参和形参占用不同内存;函数可以无返回值。 16、以下关于递归函数的叙述中,正确的是( ) A. 递归函数必须有一个明确的递归结束条件 B. 递归函数的效率通常高于循环 C. 任何问题都可以用递归解决 D. 递归函数不能有返回值 【答案】A 【解析】递归必须有终止条件,否则无限递归;递归效率通常低于循环;并非所有问题都适合递归;递归函数可以有返回值。 17、以下关于结构体的叙述中,正确的是( ) A. 结构体变量可以整体赋值 B. 结构体变量不能作为函数参数 C. 结构体变量可以进行比较运算 D.结构体变量可以包含自身类型的成员 【答案】A 【解析】 同类型结构体变量可直接赋值;可作为函数参数;不能直接比较;可以包含指向自身类型的指针,但不能包含自身类型的变量。 18、以下关于指针运算的叙述中,错误的是( ) A. 两个同类型的指针可以相减 B. 两个同类型的指针可以相加 C. 指针可以加上一个整数 D.指针可以减去一个整数 【答案】B 【解析】 指针可以相减(得到元素个数),可以加/减整数,但相加无意义。 19、若有定义:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 则 *(*(a+1)+2) 的值是( ) A. 6 B. 7 C.8 D.9 【答案】B 【解析】 a+1指向第1行,*(a+1)得到第1行首地址,+2得第1行第2列地址,取值即a[1][2]=7。 20、以下程序的输出结果是( ) #include <stdio.h> void fun(int *a, int b) { *a += b; b += *a; } main() { int x=2, y=3; fun(&x, y); printf("%d,%d", x, y); } A. 5,3 B. 5,8 C.2,3 D.2,8 【答案】A 【解析】通过指针修改x为2+3=5,b是局部变量,修改不影响y,y仍为3。 二、多选题(本题共5小题,每小题3分,共15分) 1、以下关于数组的叙述中,正确的有( ) A. 数组名代表数组首元素的地址 B. 数组名可以作为函数参数 C.数组名可以自增运算 D.数组名是一个指针常量 【答案】ABD 【解析】 数组名是地址常量,不能自增。 2、以下关于C语言运算符的叙述中,正确的有( ) A. 逗号运算符的优先级最低 B. 赋值运算符是右结合 C.逻辑非运算符优先级低于算术运算符 D.条件运算符是三元运算符 【答案】ABD 【解析】 逻辑非!优先级高于算术运算符。 3、以下关于函数的叙述中,正确的有( ) A. 函数可以没有返回值 B. 函数可以嵌套调用 C.函数可以嵌套定义 D.函数名代表函数的入口地址 【答案】ABD 【解析】 函数不能嵌套定义。 4、下面关于指针的描述正确的有( ) A. 指针变量可以指向同一类型的不同变量 B. 指针变量可以指向数组 C. 指针变量可以指向函数 D. 指针变量可以指向结构体 【答案】ABCD 【解析】 指针可以指向任何类型的数据对象。 5、设有如下代码片段: #include <stdio.h> void swap(int *x, int *y) { int *temp = x; x = y; y = temp; } main() { int arr[] = {10, 20, 30}; int *p = arr; p++; printf("%d ", *p); swap(&arr[0], &arr[1]); } 以下描述正确的有( ) A. 执行 p++ 后,指针 p 的地址值增加了 4 B. arr 和 &arr 的值是相同的,但它们的类型不同,进行指针运算时的步长也不同 C. 执行 swap 函数后,main 函数中 arr[0] 和 arr[1] 的值发生了交换 D. 表达式 *(p + 1) 等价于 p[1],且都访问的是当前 p 指向位置往后偏移一个元素后的值 【答案】A、B、D 【解析】A选项:指针的加减运算是基于所指类型的大小进行的。因为 p 是 int * 类型,且 int 占 4 字节,所以 p++ 会让地址值增加 sizeof(int),即4个字节,从而指向数组的下一个元素。 B选项:对于数组 int arr[3],arr 的类型为 int *,值为 0x1000。arr + 1 会增加 sizeof(int) (4字节)。&arr 的类型是 int (*)[3](指向整个数组的指针),值也是 0x1000。但 &arr + 1 会增加 sizeof(arr) (3 * 4 = 12字节),直接跳过整个数组。虽然地址数值相同,但类型不同导致指针运算的步长不同。 C选项:传递的是地址,函数内部交换的是局部指针变量 x 和 y 的指向,并没有交换指针所指向单元的内容。因此,main 函数中的 arr 内容不会发生改变。 D选项:p[i] 在编译器层面会被转换为 *(p + i)。两者完全等价,都是先移动指针,再取值。 三、判断题(本题共10小题,每小题1分,共10分) 1、在C语言中,变量必须在使用前定义。 ( ) 【答案】√ 【解析】C语言规定变量必须先定义后使用。 2、指针变量可以指向不同数据类型的变量,只要强制转换。 ( ) 【答案】√ 【解析】强制转换后可以指向,但解引用时需注意类型匹配 3、全局变量在程序整个运行期间都占用内存。 ( ) 【答案】√ 【解析】全局变量的有效范围是从定义位置位置到文件结束,在这个范围内的任何地方都可使用。 4、静态局部变量在函数调用结束后其值不变。 () 【答案】 √ 【解析】静态局部变量属于静态存储类型,在静态存储区中分配内存。程序运行开始就给静态局部变量分配内存,运行结束后释放。 5、宏定义#define PI 3.14在编译时进行替换,不占内存。 ( ) 【答案】√ 【解析】宏定义属于编译预处理命令,以“#”开头,不实现程序功能,用来通知编译器在对源程序进行编译之前应该做哪些预处理工作。 6、两个字符串可以用关系运算符进行比较,如"abc" > "def"。( ) 【答案】 × 【解析】字符串的比较要用串处理函数strcmp()进行比较。 7、文件包含命令#include可以包含多个文件,但只能写一个#include命令。( ) 【答案】× 【解析】可以写多个#include包含多个文件,一个include只能包含一个文件。 8、在C语言中,break语句只能用于循环语句中。( ) 【答案】× 【解析】也可用于switch语句。 9、函数调用时,实参和形参必须类型一致,否则会编译错误。( ) 【答案】× 【解析】类型不一致时可能发生隐式转换或警告,但不一定编译错误。 10、在C语言中,数组名作为函数参数时,传递的是整个数组。 ( ) 【答案】 × 【解析】传递的是首地址。 四、填空题(共10小题,每小题1分,共10分) 1、若有定义:int a=10, b=20, c;则执行c = (a>b) ? a : b;后c的值为( )。 【答案】20 【解析】条件表达式先计算表达式a>b为假,取表达式:b的值赋值给变量c。 2、表达式5/2<<1+1的计算结果是( )。 【答案】8 【解析】优先级:算术运算符 > 位运算符。 3、若有定义:int a[5]={10,20,30,40,50}, *p=a+2;则*p的值是( )。 【答案】30 【解析】指针p指向数组的第三个元素a[2],所以*p的值为30。 4、若有定义:char str[]="China";则sizeof(str)的结果是( )。 【答案】6 【解析】字符串的结尾需要有结束符’\0’。 5、函数调用时,如果采用传值方式,则形参的改变( )(会/不会)影响实参。 【答案】不会 【解析】函数采用值传递时,是单向的,不影响实参的值。 6、变量的作用域是指程序中可以访问该变量的区域。在函数内部定义的变量称为( )变量,其作用域仅限于该函数内部;而在所有函数外部定义的变量称为( )变量,其作用域从定义位置开始,到整个源文件结束。 【答案】局部 外部 7、若有定义:int x=3;则执行x = x << 2;后x的值为( )。 【答案】12 【解析】左移2位相当于乘以4 8、若有定义:int a=5, *p=&a;则*p表示( )。 【答案】变量a的值 【解析】p为指针变量,存储的是变量a的地址,*p指的就是变量a或是a的值。 8、在C语言中,如果一个函数在定义之前被调用,必须在调用前对该函数进行( ),以告知编译器该函数的返回类型和参数信息。 【答案】函数声明 【解析】C语言编译器是单遍扫描。如果函数定义出现在调用语句之后,编译器调用时还不知道该函数的存在,所以要先进行函数声明。 9、若有定义:struct student {int num; char name[20];} stu;则stu占用的内存数为( )。 【答案】24 【解析】结构体变量占用内存数量等于各域所占内存之和。 10、 若有一个函数指针p,它指向一个返回整型值且接受两个整型参数的函数,则该函数指针的声明形式为:_______ (*p)(int, int);。 【答案】int 五、简答题(本题共3题,每题5分,共15分) 1、简述C语言中指针变量的定义和初始化方法,并举例说明。 【答案】 指针变量是用于存放地址的变量。定义格式:类型名 *指针变量名;,例如 int *p;。初始化可以在定义时赋值:int a=5, *p=&a;,也可以先定义后赋值:int *p; p=&a;。指针必须指向同类型的变量。 2、简述break语句和continue语句在循环中的作用区别。 【答案】 break语句用于立即终止当前循环,跳出循环体;continue语句用于结束本次循环,跳过循环体中剩余的语句,直接进入下一次循环的判断。 3、简述C语言中结构体的定义和作用,并说明如何访问结构体中的成员。 【答案】 定义:结构体(struct)是C语言中一种构造数据类型,它允许将不同类型的数据组合成一个整体,便于管理复杂数据。定义格式如下: struct 结构体名 { 数据类型 成员1; 数据类型 成员2; ... }; 作用:将逻辑上相关的多个数据项封装为一个复合类型,提高代码的可读性和可维护性。 便于处理复杂对象,可作为函数参数传递,实现模块化编程。与数组相比,结构体可包含不同类型的数据,而数组只能存放同类型元素。 访问结构体成员:通过结构体变量直接访问:使用点运算符(.),如 stu1.id。通过指向结构体的指针访问:使用箭头运算符(->),如 pStu->id。 六、编程题(本题共1小题,每小题10分,共10分) 编写一个函数 void sort(int *arr, int n),使用指针实现冒泡排序,对长度为n的整型数组进行升序排序。要求:在函数中必须使用指针操作数组元素,不能使用数组下标(即不能出现 arr[i] 的形式)。在主函数中,先输入一个整数n(n≤100),然后输入n个整数,调用sort函数排序,最后输出排序后的数组,每个数占5位宽度。 【答案】 #include <stdio.h> void sort(int *arr, int n) { int i, j, temp; for (i = 0; i < n-1; i++) { for (j = 0; j < n-1-i; j++) { if (*(arr + j) > *(arr + j + 1)) { // 使用指针访问 temp = *(arr + j); *(arr + j) = *(arr + j + 1); *(arr + j + 1) = temp; } } } } main() { int n, i; int arr[100]; printf("请输入元素个数n:"); scanf("%d", &n); printf("请输入%d个整数:", n); for (i = 0; i < n; i++) { scanf("%d", arr + i); // 使用指针输入 } sort(arr, n); printf("排序后的数组: "); for (i = 0; i < n; i++) { printf("%5d", *(arr + i)); // 使用指针输出 } printf(" "); } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 《编程语言基础——C语言》(高教版第5版) 期末复习卷(二)原卷版 时间:90分钟 总分:100分 班级 姓名 学号 成绩 一、单项选择题(本题共20小题,每小题2分,共40分) 1、以下选项中,全部为合法的C语言标识符是( ) A. Int enum _123 B. 2_ab printf abc C. _123 If A D.a&b 0a1 LONG 2、若有定义:int a=3, b=4; 则表达式 (a++) + (++b) 的值是( ) A. 7 B. 8 C.9 D.10 3、若有定义:int x=5; 则执行 x += x -= x * x; 后x的值是( ) A. 20 B. -20 C.-40 D.40 4、若有定义:int x = 2, y = 3, z = 4; 则执行下列语句后,变量 x 的值是( ) x = (y += 2) > (z -= 1) ? (x = y + z) : (y = z - x); A. 5 B. 6 C.7 D.8 5、为避免在嵌套的条件语句if-else中产生二义性,C语言规定:else子句总是与( )配对。 A.缩排位置相同的if B.其之前最近的if C.其之后最近的if D.同一行上的 if 6、以下程序的输出结果是( ) main() { int a=5,b=4,c=3; if(a>b>c) printf("yes"); else printf("no"); } A. yes B. no C.编译错误 D.运行错误 7、假定a和b为int型变量,则执行以下语句后b的值为( )。 a = 1; b = 10; do { b - = a; a ++; } while (b-- < 0); A.9 B.–2 C.–1 D.8 8、阅读以下 C 语言代码片段,请问程序运行后输出的结果是什么( ) #include <stdio.h> main() { int i; for (i = 0; i < 3; printf("%d ", i), i++); } A. 0 1 2 B. 1 2 3 C. 0 1 2 3 D. 1 2 9、下列关于 C 语言 for 循环的描述中,错误的是哪一项( ) A. for(;;) 是一个合法的无限循环写法。 B. for 循环的三个表达式(初始化、条件、更新)都可以省略,但两个分号;不能省略。 C. 在 for(int i=0, j=10; i<j; i++, j--) 中,初始化部分和更新部分使用了逗号表达式,这是合法的。 D.for循环的条件表达式如果省略,默认视为条件为假(false),循环一次都不会执行。 10、阅读以下代码,请问 printf 输出的结果是多少( ) main() { int arr[5] = {10, 20}; int sum = 0; for (int i = 0; i < 5; i++) { sum += arr[i]; } printf("%d", sum); } A. 30 B. 10 C. 0 D.不确定的值 11、关于二维数组 int a[3][4]; 的内存存储顺序,下列说法正确的是( ) A. 按列优先存储,即先存 a[0][0], a[1][0], a[2][0]... B. 按行优先存储,即先存 a[0][0], a[0][1], a[0][2], a[0][3], 然后是 a[1][0]... C. 内存地址是随机分配的,没有固定顺序。 D. 编译器可以自由选择按行或按列存储,取决于优化选项。 12、阅读以下代码,程序的输出结果是( ) include main() { int matrix[2][3] = {{1, 2},{3, 4, 5}}; printf("%d %d", matrix[0][2], matrix[1][2]); } A. 0 5 B. 2 5 C. 0 0 D. 编译错误 13、下列关于字符数组初始化的代码中,哪一个是错误的或者会导致未定义行为( ) A. char str1[] = "Hello"; B. char str2[6] = "Hello"; C. char str3[5] = "Hello"; D. char str4[] = {'H', 'e', 'l', 'l', 'o', '0'}; 14、阅读以下代码,输出结果是( ) #include<stdio.h> #include<string.h> main() { char s1[] = "China"; char s2[10] = "Beijing"; s1[0] = 'c'; s2[0] = 'b'; printf("%d %d", strlen(s1), sizeof(s1)); } A. 5 5 B. 5 6 C. 6 6 D. 4 5 15、以下关于函数的叙述中,正确的是( ) A. 每个函数都可以被单独编译 B. 所有函数都是平行的,函数间可以嵌套定义 C. 函数调用时,实参和形参共用内存单元 D. 函数必须要有返回值 16、以下关于递归函数的叙述中,正确的是( ) A. 递归函数必须有一个明确的递归结束条件 B. 递归函数的效率通常高于循环 C. 任何问题都可以用递归解决 D. 递归函数不能有返回值 17、以下关于结构体的叙述中,正确的是( ) A. 结构体变量可以整体赋值 B. 结构体变量不能作为函数参数 C. 结构体变量可以进行比较运算 D.结构体变量可以包含自身类型的成员 18、以下关于指针运算的叙述中,错误的是( ) A. 两个同类型的指针可以相减 B. 两个同类型的指针可以相加 C. 指针可以加上一个整数 D.指针可以减去一个整数 19、若有定义:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 则 *(*(a+1)+2) 的值是( ) A. 6 B. 7 C.8 D.9 20、以下程序的输出结果是( ) #include <stdio.h> void fun(int *a, int b) { *a += b; b += *a; } main() { int x=2, y=3; fun(&x, y); printf("%d,%d", x, y); } A. 5,3 B. 5,8 C.2,3 D.2,8 二、多选题(本题共5小题,每小题3分,共15分) 1、以下关于数组的叙述中,正确的有( ) A. 数组名代表数组首元素的地址 B. 数组名可以作为函数参数 C.数组名可以自增运算 D.数组名是一个指针常量 2、以下关于C语言运算符的叙述中,正确的有( ) A. 逗号运算符的优先级最低 B. 赋值运算符是右结合 C.逻辑非运算符优先级低于算术运算符 D.条件运算符是三元运算符 3、以下关于函数的叙述中,正确的有( ) A. 函数可以没有返回值 B. 函数可以嵌套调用 C.函数可以嵌套定义 D.函数名代表函数的入口地址 4、下面关于指针的描述正确的有( ) A. 指针变量可以指向同一类型的不同变量 B. 指针变量可以指向数组 C. 指针变量可以指向函数 D. 指针变量可以指向结构体 5、设有如下代码片段: #include <stdio.h> void swap(int *x, int *y) { int *temp = x; x = y; y = temp; } main() { int arr[] = {10, 20, 30}; int *p = arr; p++; printf("%d ", *p); swap(&arr[0], &arr[1]); } 以下描述正确的有( ) A. 执行 p++ 后,指针 p 的地址值增加了 4 B. arr 和 &arr 的值是相同的,但它们的类型不同,进行指针运算时的步长也不同 C. 执行 swap 函数后,main 函数中 arr[0] 和 arr[1] 的值发生了交换 D. 表达式 *(p + 1) 等价于 p[1],且都访问的是当前 p 指向位置往后偏移一个元素后的值 三、判断题(本题共10小题,每小题1分,共10分) 1、在C语言中,变量必须在使用前定义。 ( ) 2、指针变量可以指向不同数据类型的变量,只要强制转换。 ( ) 3、全局变量在程序整个运行期间都占用内存。 ( ) 4、静态局部变量在函数调用结束后其值不变。 () 5、宏定义#define PI 3.14在编译时进行替换,不占内存。 ( ) 6、两个字符串可以用关系运算符进行比较,如"abc" > "def"。( ) 7、文件包含命令#include可以包含多个文件,但只能写一个#include命令。( ) 8、在C语言中,break语句只能用于循环语句中。( ) 9、函数调用时,实参和形参必须类型一致,否则会编译错误。( ) 10、在C语言中,数组名作为函数参数时,传递的是整个数组。 ( ) 四、填空题(共10小题,每小题1分,共10分) 1、若有定义:int a=10, b=20, c;则执行c = (a>b) ? a : b;后c的值为( )。 2、表达式5/2<<1+1的计算结果是( )。 3、若有定义:int a[5]={10,20,30,40,50}, *p=a+2;则*p的值是( )。 4、若有定义:char str[]="China";则sizeof(str)的结果是( )。 5、函数调用时,如果采用传值方式,则形参的改变( )(会/不会)影响实参。 6、变量的作用域是指程序中可以访问该变量的区域。在函数内部定义的变量称为( )变量,其作用域仅限于该函数内部;而在所有函数外部定义的变量称为( )变量,其作用域从定义位置开始,到整个源文件结束。 7、若有定义:int x=3;则执行x = x << 2;后x的值为( )。 8、若有定义:int a=5, *p=&a;则*p表示( )。 8、在C语言中,如果一个函数在定义之前被调用,必须在调用前对该函数进行( ),以告知编译器该函数的返回类型和参数信息。 9、若有定义:struct student {int num; char name[20];} stu;则stu占用的内存数为( )。 10、 若有一个函数指针p,它指向一个返回整型值且接受两个整型参数的函数,则该函数指针的声明形式为:_______ (*p)(int, int);。 五、简答题(本题共3题,每题5分,共15分) 1、简述C语言中指针变量的定义和初始化方法,并举例说明。 2、 简述break语句和continue语句在循环中的作用区别。 3、 简述C语言中结构体的定义和作用,并说明如何访问结构体中的成员。 六、编程题(本题共1小题,每小题10分,共10分) 编写一个函数 void sort(int *arr, int n),使用指针实现冒泡排序,对长度为n的整型数组进行升序排序。要求:在函数中必须使用指针操作数组元素,不能使用数组下标(即不能出现 arr[i] 的形式)。在主函数中,先输入一个整数n(n≤100),然后输入n个整数,调用sort函数排序,最后输出排序后的数组,每个数占5位宽度。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

《编程语言基础-C语言》(高教版第5版)期末复习卷(二)(山东版)
1
《编程语言基础-C语言》(高教版第5版)期末复习卷(二)(山东版)
2
《编程语言基础-C语言》(高教版第5版)期末复习卷(二)(山东版)
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。