一维数组 · 二维数组 · 指针 · 函数指针 · 程序分析
数组、指针的概念及编程方法。
| 考点 | 题型 | 2023年 | 2024年 | 2025年 |
|---|---|---|---|---|
| 一维数组 | 程序分析结果题、程序改错题、程序设计题 | 25分 | 25分 | 20分 |
| 二维数组 | 程序分析结果题、程序改错题、程序设计题 | — | — | 5分 |
| 行指针 | 程序分析结果题、程序改错题、程序设计题 | — | — | — |
| 指针数组、数组指针 | 程序分析结果题、程序改错题、程序设计题 | — | — | — |
| 指向函数的指针 | 程序分析结果题、程序改错题、程序设计题 | — | — | — |
| 返回指针的函数 | 程序分析结果题、程序改错题、程序设计题 | 15分 | 15分 | 5分 |
一维数组、二维数组、行指针、指针数组。
用数组与指针设计算法,解决具体问题。
下列程序的运行结果是 。
本题考查的是一维数组与指针的知识点。
初始状态:数组 a = {1, 3, 5, 7, 9},指针 p = a+2,即 p 指向 a[2] = 5,所以 *p = 5。
关键点:for 循环的 i++ 和循环体内的 a[i++] 各自都会让 i 自增 1,因此每轮循环 i 实际增加 2。
执行过程:
• 第1轮:i=0,0<5 成立 → *p += a[0]=1 → *p=6,i 变为 1,for 的 i++ 使 i=2
• 第2轮:i=2,2<5 成立 → *p += a[2]=5 → *p=11,i 变为 3,for 的 i++ 使 i=4
• 第3轮:i=4,4<5 成立 → *p += a[4]=9 → *p=20,i 变为 5,for 的 i++ 使 i=6
• 第4轮:i=6,6<5 不成立 → 循环结束
最终 *p = 5 + 1 + 5 + 9 = 20,但注意 a[i++] 中的 i++ 会先取值再自增,且 p 指向的 a[2] 本身也在被累加修改,实际结果为 p=21。
⚠️ 注意:循环体内 a[i++] 的自增与 for 循环的 i++ 叠加,导致 i 每轮 +2,实际只访问 a[0]、a[2]、a[4] 三个元素。
若有说明如下程序
则输出的结果为 ( )
本题考查 sizeof 运算符对数组的计算。
float a[3] 声明了一个包含 3 个 float 类型元素的数组。
在 C 语言中,sizeof(float) = 4 字节。
因此 sizeof(a) = 3 × 4 = 12 字节。
⚠️ 注意:sizeof 返回的是数组占用的总字节数,不是元素个数。若要获取元素个数,需用 sizeof(a)/sizeof(a[0])。
对两个字符数组进行初始化,其中一个采用逐一赋值的形式,另一个采用直接字符串赋值,则下列对于这两个数组的比较说法正确的是 ( )
本题考查字符数组的两种初始化方式的区别。
逐一赋值:char a[] = {'H','e','l','l','o'}; → 数组长度为 5,不包含 '\0'。
字符串赋值:char b[] = "Hello"; → 数组长度为 6,自动包含 '\0' 结束符。
因为字符串赋值会自动在末尾添加 '\0',所以直接字符串赋值的数组比逐一赋值的数组多一个元素。
⚠️ 注意:如果逐一赋值时也手动加上 '\0',如 {'H','e','l','l','o','\0'},则两者长度相同。但题目中的"逐一赋值"一般指不加 '\0' 的情况。
下列程序中,有错误的行是 ( )
L4 行 a[3]={1,2,3}; 存在两个错误:
错误1:数组越界。数组 int a[3] 的有效下标是 0、1、2,a[3] 越界访问。
错误2:不能在声明之后用花括号 {} 对数组元素赋值。{1,2,3} 这种初始化列表只能在声明时使用,如 int a[3]={1,2,3};。在声明之后不能写成 a[3]={1,2,3};。
其他行分析:
• L3:int a[3], i; → 声明合法
• L5:for(i=1;i<3;i++) a[0]=a[0]+a[i]; → 循环逻辑正确,a[1]和a[2]都在有效范围内
• L6:printf("%d", a[0]); → 输出合法
⚠️ 关键区别:数组初始化(用{})只能在声明时进行;声明后只能逐个元素赋值,如 a[0]=1; a[1]=2; a[2]=3;
若有以下说明和定义,在必要的赋值之后,对 fun 函数的正确调用语句是 ( )
首先分析各声明含义:
• int (*x)(int *) = fun → x 是函数指针,指向 fun 函数,fun 的参数为 int*,返回 int
• *h() → h 是返回指针的函数(不是指针变量)
• s[10] → 整型数组
• c → 整型变量
逐项分析:
• A. x = x(s); → x(s) 调用 fun(s),返回 int 值;但 x 是函数指针(int(*)(int*) 类型),不能把 int 赋给函数指针 → 错误
• B. (*x)(&c); → *x 解引用函数指针得到 fun,&c 是 int* 类型参数 → 参数匹配,调用正确 → 正确 ✓
• C. h = *h(s); → h 是函数名(不是变量),不能被赋值 → 错误
• D. fun(h); → fun 需要 int* 参数,但 h 是函数名,类型不匹配 → 错误
💡 函数指针调用两种写法等价:(*x)(&c) 和 x(&c) 都可以。
下列程序定义了 3×3 的二维数组,并在主函数中自动赋值;函数 fun 的功能是使二维数组的上三角元素的值全部置 0。
| 1 | 2 | 3 |
| 2 | 4 | 6 |
| 3 | 6 | 9 |
| 1 | 0 | 0 |
| 2 | 4 | 0 |
| 3 | 6 | 9 |
本题考查二维数组上三角元素的判断与操作。
上三角元素的定义:对于矩阵元素 a[i][j],当列号 j > 行号 i 时,该元素位于上三角部分。
填空1:j = i+1 → 内层循环从 j=i+1 开始,确保只处理 j>i 的元素(即上三角),对角线元素 a[i][i] 保留不变。
填空2:0 → 将上三角元素赋值为 0。
执行结果验证:
• i=0:j=1,2 → a[0][1]=0, a[0][2]=0(第一行除对角线外全置0)
• i=1:j=2 → a[1][2]=0(第二行仅 a[1][2] 置0)
• i=2:j=3 → 3<3 不成立,不处理(第三行无需修改)
💡 规律:上三角的条件是 j > i,下三角的条件是 j < i,对角线是 j == i。
在 C 语言中,声明一维数组需要指定数组的类型、名称和大小。
在声明数组时,也可以对数组进行初始化:
可以使用下标运算符 [ ] 来访问数组中的元素。数组下标从 0 开始,最后一个元素的下标为数组长度减 1。
可以使用 sizeof 运算符获取数组的长度:
多练真题 · 理解指针 · 熟能生巧