内容正文:
《编程语言基础——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位宽度。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$