资源描述
江西工程学院《C语言》2025-2026学年期末试卷
一、单项选择题(本大题共10小题,每小题2分,共20分)
1. C语言中,用于动态分配内存的函数是()。
A. malloc B. free C. calloc D. realloc
2. 在C语言中,若定义了数组int arr[10],则数组arr的合法下标范围是()。
A. 0-9 B. 1-10 C. 0-10 D. 1-9
3. 以下关于C语言函数的说法,正确的是()。
A. 函数可以嵌套定义 B. 函数必须有返回值 C. 函数名必须与变量名不同 D. 函数参数可以是数组
4. C语言中,表示逻辑非的运算符是()。
A. && B. || C. ! D. ~
5. 在C语言中,宏定义的关键字是()。
A. define B. include C. extern D. static
6. 以下关于C语言指针的说法,错误的是()。
A. 指针可以指向数组 B. 指针可以指向函数 C. 指针可以是 NULL D. 指针变量必须初始化
7. C语言中,用于读取文件内容的函数是()。
A. printf B. scanf C. fgets D. fwrite
8. 在C语言中,结构体的关键字是()。
A. struct B. union C. enum D. typedef
9. 以下关于C语言中的位运算的说法,正确的是()。
A. << 运算符用于右移 B. & 运算符用于按位或 C. ^ 运算符用于按位与 D. ~ 运算符用于按位异或
10. C语言中,用于声明常量的关键字是()。
A. const B. define C. enum D. static
二、多项选择题(本大题共5小题,每小题2分,共10分)
1. C语言中,以下哪些是合法的标识符?()
A. int_123 B. 123int C. _int D. int-int
2. 以下关于C语言中的循环的说法,正确的有?()
A. for 循环 B. while 循环 C. do-while 循环 D. continue 语句
3. C语言中,以下哪些是合法的赋值语句?()
A. x = y + z B. y = x * (x + y) C. z = x / y D. x = y = z
4. 以下关于C语言中的数组说法,正确的有?()
A. 数组的大小必须是常量表达式 B. 数组名可以像变量一样传递 C. 数组可以动态分配 D. 数组元素的下标从0开始
5. C语言中,以下哪些是合法的函数声明?()
A. int add(int x, int y) B. void print() C. int main() D. float average(int arr[], int n)
三、(本大题共1题,共10分)
阅读以下C语言代码,并回答问题:
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int num;
printf("Enter a positive integer: ");
scanf("%d", &num);
printf("Factorial of %d is %d\n", num, factorial(num));
return 0;
}
1. 请解释这段代码的功能。
2. 请说明这段代码中使用了哪些编程概念。
3. 请写出这段代码的调用栈结构。
四、(本大题共1题,共15分)
材料1:
#include <stdio.h>
typedef struct {
char name[50];
int age;
float salary;
} Employee;
void printEmployee(Employee e) {
printf("Name: %s, Age: %d, Salary: %.2f\n", e.name, e.age, e.salary);
}
int main() {
Employee e1 = {"John Doe", 30, 5000.75};
printEmployee(e1);
return 0;
}
材料2:
#include <stdio.h>
typedef struct {
char name[50];
int age;
float salary;
} Employee;
void printEmployee(Employee *e) {
printf("Name: %s, Age: %d, Salary: %.2f\n", e->name, e->age, e->salary);
}
int main() {
Employee e1 = {"John Doe", 30, 5000.75};
printEmployee(&e1);
return 0;
}
请回答以下问题:
1. 比较材料1和材料2中的`printEmployee`函数,说明它们在参数传递方式上的区别。
2. 解释在材料2中,为什么使用指针传递`Employee`结构体对象可以更高效。
3. 请写出材料2中`printEmployee`函数的调用栈结构。
五、(本大题共1题,共15分)
材料1:
#include <stdio.h>
int add(int x, int y) {
return x + y;
}
int main() {
int a = 5;
int b = 10;
int result = add(a, b);
printf("Sum is %d\n", result);
return 0;
}
材料2:
#include <stdio.h>
int add(int x, int y) {
return x + y;
}
int main() {
int a = 5;
int b = 10;
int *ptr = &add;
int result = (*ptr)(a, b);
printf("Sum is %d\n", result);
return 0;
}
请回答以下问题:
1. 比较材料1和材料2中的代码,说明材料2中如何通过函数指针调用`add`函数。
2. 解释在材料2中,使用函数指针调用函数的优势。
3. 请写出材料2中`main`函数的调用栈结构。
展开阅读全文