Skip to content

3.1 高频考点强化练习

计算机程序设计 · C语言 · 3.1 高频考点强化练习

高频考点强化练习 · 计算机基础与程序设计

适用:2027 届广东专升本《计算机基础与程序设计》 编排:按考频从高到低排列,每个考点配 2–3 道典型题 用法:先做题,再看解析,错题回 系统笔记 补概念


C 语言高频考点

考点 1:sizeof 与 strlen 的区别(考频 ★★★★★)

核心区别

  • sizeof:运算符,编译时计算,返回类型/变量所占字节数包含 \0
  • strlen:函数,运行时计算,返回字符串字符数不包含 \0
  • sizeof(数组) = 整个数组大小;sizeof(指针) = 4 或 8 字节

题 1:以下程序输出是( )

c
char s[] = "hello";
char *p = s;
printf("%d, %d, %d\n", sizeof(s), sizeof(p), strlen(s));

A. 5, 4, 5 B. 6, 4, 5 C. 6, 6, 5 D. 5, 5, 6

答案:B

解析sizeof(s) = 6(5字符+\0),sizeof(p) = 4(32位指针)或 8(64位),strlen(s) = 5。

题 2:以下程序输出是( )

c
int a[10];
printf("%d\n", sizeof(a) / sizeof(int));

A. 10 B. 4 C. 40 D. 1

答案:A

解析sizeof(a) = 40(10×4),sizeof(int) = 4,40/4 = 10。这是计算数组长度的常用写法。


考点 2:运算符优先级与表达式求值(考频 ★★★★★)

优先级速记(从高到低):

  1. () [] -> .
  2. ! ~ ++ -- +(单目) -(单目) *(解引用) &(取地址) sizeof
  3. * / %
  4. + -
  5. << >>
  6. < <= > >=
  7. == !=
  8. &(按位与)
  9. ^(按位异或)
  10. |(按位或)
  11. &&
  12. ||
  13. ?:(三目)
  14. = += -= 等赋值
  15. ,(逗号)

题 1:表达式 2 + 3 * 4 - 5 / 2 的值是( )

A. 9 B. 12 C. 10 D. 11

答案:B

解析3*4=125/2=2(整数除法),2+12-2=12

题 2:表达式 10 != 9 的值是( )

A. 0 B. 1 C. true D. 非0

答案:B

解析:C 语言中关系表达式为真时值为 1(不是任意非0),为假时值为 0。

题 3:逗号表达式 (a = 3, b = 5, a + b) 的值是( )

A. 3 B. 5 C. 8 D. 15

答案:C

解析:逗号表达式从左到右计算,取最后一个表达式的值。a=3, b=5, a+b=8。


考点 3:三目运算符(条件运算符)(考频 ★★★★)

语法条件 ? 表达式1 : 表达式2

  • 条件为真 → 取表达式1
  • 条件为假 → 取表达式2
  • 只执行其中一个分支
  • C 语言中唯一的三目运算符

题 1:以下程序输出是( )

c
int a = 5, b = 3;
printf("%d\n", a > b ? a++ : b++);
printf("%d, %d\n", a, b);

A. 5 和 6,3 B. 5 和 5,3 C. 3 和 5,4 D. 5 和 6,4

答案:A

解析a > b 为真,取 a++(先返回 5,再加 1),所以输出 5,a 变为 6。b 不执行,仍为 3。

题 2:以下程序输出是( )

c
int x = 10;
printf("%d\n", x > 5 ? x < 8 ? 1 : 2 : 3);

A. 1 B. 2 C. 3 D. 10

答案:B

解析:嵌套三目。x > 5 为真,执行 x < 8 ? 1 : 2x < 8 为假,取 2。


考点 4:整数除法与取余(考频 ★★★★)

核心规则

  • 两个整数相除,结果截断为整数(向零取整)
  • 5 / 2 = 2-5 / 2 = -2(向零取整)
  • 取余 % 只能用于整数,结果符号与被除数相同
  • 想要浮点结果:5.0 / 2(float)5 / 2

题 1:表达式 17 % 5 的值是( )

A. 2 B. 3 C. 4 D. 5

答案:A

解析:17 = 5×3 + 2,余数为 2。

题 2:以下程序输出是( )

c
printf("%d, %.1f\n", 7 / 2, 7.0 / 2);

A. 3, 3.5 B. 3.5, 3.5 C. 3, 3.0 D. 3.5, 3

答案:A

解析7/2 整数除法 = 3;7.0/2 浮点除法 = 3.5。


考点 5:自增自减运算符(考频 ★★★★)

核心区别

  • i++:先使用 i 的值,再加 1(后置)
  • ++i:先加 1,再使用 i 的值(前置)
  • i-- / --i 同理
  • 注意:同一表达式中多次修改同一变量是未定义行为,考试通常按从左到右理解

题 1:以下程序输出是( )

c
int i = 5;
printf("%d\n", i++);
printf("%d\n", i);

A. 5 和 5 B. 6 和 5 C. 5 和 6 D. 6 和 6

答案:C

解析i++ 先返回 5,再加 1。第一个 printf 输出 5,之后 i=6,第二个输出 6。

题 2:以下程序输出是( )

c
int a = 3, b;
b = a++ + ++a;
printf("%d, %d\n", a, b);

A. 5, 8 B. 5, 7 C. 4, 7 D. 结果不确定

答案:D(考试通常按 A 理解,但严格来说是未定义行为)

解析:同一表达式中两次修改 a,C 标准未定义求值顺序。若按从左到右:a++取3(a=4),++a取5(a=5),3+5=8。考试一般按这个理解。


考点 6:字符串函数(考频 ★★★★★)

常用函数(都在 string.h):

  • strlen(s):返回字符串长度(不计 \0
  • strcpy(dest, src):复制 src 到 dest(含 \0),返回 dest
  • strcat(dest, src):把 src 拼接到 dest 末尾(覆盖 dest 的 \0
  • strcmp(s1, s2):比较,s1<s2 返回负,相等返回 0,s1>s2 返回正
  • strchr(s, c):查找字符 c 首次出现位置

题 1:以下程序输出是( )

c
char s[20] = "hello";
strcat(s, "world");
printf("%d\n", strlen(s));

A. 5 B. 10 C. 11 D. 20

答案:B

解析:拼接后 s = "helloworld",strlen = 10。

题 2:以下程序输出是( )

c
char s1[] = "abc", s2[] = "abd";
printf("%d\n", strcmp(s1, s2));

A. 正数 B. 负数 C. 0 D. 1

答案:B

解析:逐字符比较,前两个字符相同,第三个 'c' < 'd',所以 s1 < s2,返回负数。


考点 7:指针与数组(考频 ★★★★★)

核心关系

  • 数组名在表达式中退化为指向首元素的指针
  • a[i] 等价于 *(a + i)
  • &a[i] 等价于 a + i
  • 数组名是常量指针,不能修改(不能 a++
  • 指针是变量,可以修改(p++
  • 数组作为函数参数退化为指针,sizeof 会失效

题 1:以下程序输出是( )

c
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
printf("%d\n", *(p + 2));

A. 1 B. 2 C. 3 D. 4

答案:C

解析:p 指向 a[0],p+2 指向 a[2],*(p+2) = a[2] = 3。

题 2:以下程序输出是( )

c
int a[5] = {1, 2, 3, 4, 5};
int *p = &a[3];
printf("%d\n", p[-1]);

A. 2 B. 3 C. 4 D. 编译错误

答案:B

解析:p 指向 a[3],p[-1] 等价于 *(p-1) = a[2] = 3。指针下标可以为负,只要不越界。


考点 8:函数参数传递(考频 ★★★★)

核心规则

  • C 语言只有传值调用
  • 普通变量传值:形参改变不影响实参
  • 想要修改实参:传指针(地址),在函数内解引用修改
  • 数组传参:退化为指针,函数内可修改数组元素
  • 二维数组传参:必须指定第二维大小,如 int a[][4]

题 1:以下程序输出是( )

c
void func(int a) { a = 100; }
int main() {
    int x = 5;
    func(x);
    printf("%d\n", x);
    return 0;
}

A. 5 B. 100 C. 0 D. 不确定

答案:A

解析:传值调用,形参 a 是实参 x 的副本,修改 a 不影响 x。

题 2:以下程序输出是( )

c
void func(int *a) { *a = 100; }
int main() {
    int x = 5;
    func(&x);
    printf("%d\n", x);
    return 0;
}

A. 5 B. 100 C. 0 D. 编译错误

答案:B

解析:传地址,函数内通过指针修改实参 x 的值为 100。


考点 9:循环结构(考频 ★★★★)

核心考点

  • for 循环三部分:初始化、条件、增量
  • while / do-while 区别:do-while 至少执行一次
  • break:跳出整个循环
  • continue:跳过本次循环剩余部分,进入下一次
  • 嵌套循环的执行次数

题 1:以下程序输出是( )

c
int i, j, count = 0;
for (i = 0; i < 3; i++)
    for (j = 0; j < 2; j++)
        count++;
printf("%d\n", count);

A. 5 B. 6 C. 3 D. 2

答案:B

解析:外层 3 次,内层 2 次,共 3×2 = 6 次。

题 2:以下程序输出是( )

c
int i;
for (i = 0; i < 5; i++) {
    if (i == 2) continue;
    if (i == 4) break;
    printf("%d ", i);
}

A. 0 1 2 3 4 B. 0 1 3 C. 0 1 3 4 D. 0 1 2 3

答案:B

解析:i=0 打印,i=1 打印,i=2 continue 跳过,i=3 打印,i=4 break 退出。输出 0 1 3。


考点 10:选择结构(考频 ★★★)

核心考点

  • if-else 的 else 配对:else 与最近的未配对的 if 配对(悬空 else)
  • switchbreak:不加 break 会穿透
  • === 的区别(高频错误)
  • 逻辑运算符 && || 的短路求值

题 1:以下程序输出是( )

c
int a = 3, b = 5;
if (a > b);
    printf("A");
printf("B");

A. AB B. A C. B D. 编译错误

答案:A

解析if (a > b); 末尾有分号,if 语句是空语句。无论条件真假,后面的 printf("A") 都会执行。输出 AB。

题 2:以下程序输出是( )

c
int x = 1;
switch (x) {
    case 1: printf("1");
    case 2: printf("2"); break;
    case 3: printf("3");
    default: printf("default");
}

A. 1 B. 12 C. 123default D. 2

答案:B

解析:x=1 进入 case 1,打印 1,没有 break,继续穿透到 case 2,打印 2,遇到 break 退出。输出 12。


数据结构高频考点

考点 11:栈和队列(考频 ★★★★★)

核心概念

  • 栈:后进先出(LIFO),只在栈顶操作
  • 队列:先进先出(FIFO),队尾插入、队头删除
  • 循环队列:判空 front == rear,判满 (rear + 1) % maxSize == front
  • 栈的应用:函数调用、表达式求值、括号匹配、递归
  • 队列的应用:进程调度、BFS、缓冲区

题 1:入栈序列 1,2,3,4,不可能的出栈序列是( )

A. 4,3,2,1 B. 2,1,4,3 C. 3,1,4,2 D. 1,2,3,4

答案:C

解析:C 中 3 先出栈说明 1,2 已入栈且 2 在栈顶,出栈必须 2 先于 1,不可能 1 先出。

题 2:循环队列用数组 A[0..m-1] 存放元素,front 指向队头元素,rear 指向队尾元素的下一个位置,则当前元素个数是( )

A. (rear - front + m) % m B. rear - front + 1 C. rear - front D. (rear - front) % m

答案:A

解析:循环队列元素个数公式:(rear - front + m) % m。加 m 是为了处理 rear < front 的情况。


考点 12:二叉树的性质与遍历(考频 ★★★★★)

核心性质

  • 第 i 层最多 2^(i-1) 个节点
  • 深度为 k 的二叉树最多 2^k - 1 个节点
  • 叶子节点数 n0 = 度为 2 的节点数 n2 + 1
  • 完全二叉树深度:⌊log2(n)⌋ + 1
  • 满二叉树:每层都满

三种遍历

  • 先序:根 → 左 → 右
  • 中序:左 → 根 → 右
  • 后序:左 → 右 → 根

题 1:一棵二叉树有 10 个度为 1 的节点,15 个度为 2 的节点,则叶子节点数是( )

A. 15 B. 16 C. 25 D. 26

答案:B

解析:n0 = n2 + 1 = 15 + 1 = 16。度为 1 的节点数不影响这个公式。

题 2:先序遍历 ABDEGCF,中序遍历 DBGEACF,后序遍历是( )

A. DGEBFCA B. DGEBCFA C. DEGBCFA D. DGEFCBA

答案:A

解析

  • 根 A,左子树 DBGE,右子树 CF
  • 左子树先序 BDEG,中序 DBGE → B 为根,D 左,EG 右
  • 右子树 EG:先序 EG,中序 GE → E 为根,G 左
  • 右子树 CF:先序 CF,中序 CF → C 为根,F 右
  • 后序:D → G → E → B → F → C → A = DGEBFCA

考点 13:排序算法(考频 ★★★★★)

八大排序对比

排序最好平均最坏空间稳定性
冒泡O(n)O(n²)O(n²)O(1)稳定
选择O(n²)O(n²)O(n²)O(1)不稳定
插入O(n)O(n²)O(n²)O(1)稳定
希尔O(n)O(n^1.3)O(n²)O(1)不稳定
快速O(nlogn)O(nlogn)O(n²)O(logn)不稳定
归并O(nlogn)O(nlogn)O(nlogn)O(n)稳定
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不稳定
基数O(d(n+r))O(d(n+r))O(d(n+r))O(n+r)稳定

题 1:以下排序中,平均时间复杂度为 O(n log n) 且稳定的是( )

A. 快速排序 B. 归并排序 C. 堆排序 D. 希尔排序

答案:B

解析:归并排序 O(nlogn) 且稳定。快速排序不稳定,堆排序不稳定,希尔排序不稳定且复杂度 O(n^1.3)。

题 2:对序列 {49, 38, 65, 97, 76, 13, 27} 进行第一趟快速排序(以第一个元素为基准)后的结果是( )

A. {27, 38, 13, 49, 76, 97, 65} B. {13, 27, 38, 49, 65, 76, 97} C. {27, 38, 13, 49, 65, 97, 76} D.

答案:A

解析:基准 49,从右找小于 49 的(27),从左找大于 49 的(65),交换... 最终 49 归位,左边都小于 49,右边都大于 49。结果:{27, 38, 13, 49, 76, 97, 65}。


考点 14:图的存储与遍历(考频 ★★★★)

存储方式

  • 邻接矩阵:二维数组,适合稠密图,空间 O(n²)
  • 邻接表:数组+链表,适合稀疏图,空间 O(n+e)

遍历

  • DFS(深度优先):类似先序遍历,用栈/递归
  • BFS(广度优先):类似层序遍历,用队列

题 1:n 个顶点 e 条边的无向图,用邻接表存储时,边表节点总数是( )

A. e B. 2e C. n+e D. n+2e

答案:B

解析:无向图每条边在邻接表中出现两次(u 的邻接表有 v,v 的邻接表有 u),所以边表节点总数是 2e。

题 2:图的 BFS 遍历类似于二叉树的( )

A. 先序遍历 B. 中序遍历 C. 后序遍历 D. 层序遍历

答案:D

解析:BFS 按层次遍历,先访问距离起点近的节点,类似于二叉树的层序遍历。


考点 15:查找算法(考频 ★★★★)

核心考点

  • 顺序查找:O(n),无序表也可用
  • 折半查找:O(log n),要求顺序存储 + 有序
  • 散列表:平均 O(1),冲突处理:开放定址法、链地址法
  • 散列表 ASL(平均查找长度)与装填因子 α 有关

题 1:对长度为 10 的有序表进行折半查找,等概率下查找成功的平均查找长度是( )

A. 2.9 B. 3.0 C. 3.1 D. 2.5

答案:A

解析:构造判定树,10 个节点的判定树:

  • 第1层1个(比较1次)
  • 第2层2个(比较2次)
  • 第3层4个(比较3次)
  • 第4层3个(比较4次) ASL = (1×1 + 2×2 + 4×3 + 3×4) / 10 = (1+4+12+12)/10 = 29/10 = 2.9

题 2:散列表的装填因子 α 越大,则( )

A. 冲突可能性越小,查找效率越高 B. 冲突可能性越大,查找效率越低 C. 冲突可能性越小,查找效率越低 D. 冲突可能性越大,查找效率越高

答案:B

解析:α = 元素数 / 表长,α 越大表越满,冲突越多,查找效率越低。


考点 16:线性表(考频 ★★★)

核心考点

  • 顺序表:随机访问 O(1),插入删除 O(n)
  • 链表:插入删除 O(1)(已知位置),查找 O(n)
  • 单链表、双链表、循环链表
  • 链表操作:插入、删除、反转、合并

题 1:在长度为 n 的顺序表中删除第 i 个元素(1≤i≤n),需要移动( )个元素

A. n-i B. n-i+1 C. i D. i-1

答案:A

解析:删除第 i 个元素,后面的元素(i+1 到 n)都要前移,共 n-i 个。

题 2:在单链表中,已知 q 指向 p 的前驱节点,若在 q 和 p 之间插入 s 节点,则执行( )

A. s->next = p->next; p->next = s; B. q->next = s; s->next = p; C. p->next = s; s->next = q; D. s->next = q; q->next = s;

答案:B

解析:q 是 p 的前驱,在 q 和 p 之间插入 s:先让 s 指向 p(s->next = p),再让 q 指向 s(q->next = s)。顺序不能反。


考点 17:算法复杂度分析(考频 ★★★)

核心概念

  • 时间复杂度:算法执行时间随问题规模 n 的增长率
  • 空间复杂度:算法所需额外空间随 n 的增长率
  • 常见复杂度:O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n³) < O(2^n)
  • 分析循环:嵌套循环相乘,并列循环相加

题 1:以下程序的时间复杂度是( )

c
for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
        a[i][j] = 0;

A. O(n) B. O(n log n) C. O(n²) D. O(2^n)

答案:C

解析:两层嵌套循环,每层 n 次,共 n² 次操作,O(n²)。

题 2:以下程序的时间复杂度是( )

c
i = 1;
while (i <= n)
    i = i * 2;

A. O(n) B. O(log n) C. O(n²) D. O(1)

答案:B

解析:i 每次乘 2,设循环 k 次,则 2^k ≤ n,k ≤ log2(n),时间复杂度 O(log n)。


高频考点刷题清单

优先级考点建议题量
★★★★★sizeof/strlen、运算符优先级、字符串函数、指针与数组各 10 题
★★★★★栈和队列、二叉树遍历、排序算法各 8 题
★★★★三目运算符、整数除法、自增自减、函数传参各 6 题
★★★★图的存储遍历、查找算法各 6 题
★★★循环结构、选择结构、线性表、复杂度分析各 5 题

2027 备考指南 · 知识点笔记 · 改错题专项 · 回真题总览

仅供个人学习 · 考生回忆版 · 非考试院原卷