计算机应用类专业综合知识理论(下)

第五章 数组与指针

一维数组 · 二维数组 · 指针 · 函数指针 · 程序分析

📋考纲解读

📝 考试内容

数组、指针的概念及编程方法。

考点解读

近三年考点、题型、分值列表

考点题型2023年2024年2025年
一维数组程序分析结果题、程序改错题、程序设计题25分25分20分
二维数组程序分析结果题、程序改错题、程序设计题5分
行指针程序分析结果题、程序改错题、程序设计题
指针数组、数组指针程序分析结果题、程序改错题、程序设计题
指向函数的指针程序分析结果题、程序改错题、程序设计题
返回指针的函数程序分析结果题、程序改错题、程序设计题15分15分5分
⭐ 高频考点

一维数组、二维数组、行指针、指针数组。

🎯 重难点分析

用数组与指针设计算法,解决具体问题。

📝真题回顾 — 程序分析结果题

2024年真题 程序分析结果题

下列程序的运行结果是  

#include<stdio.h> int main( ){ int a[ ] = {1,3,5,7,9}; int i, *p = a+2; for(i=0;i<5;i++) *p += a[i++]; printf("p=%d", *p); return 0; }

📌 答案

p = 21

💡 解析

本题考查的是一维数组与指针的知识点。

初始状态:数组 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] 三个元素。

✏️巩固提高 — 第 1 题

选择题 sizeof 运算

若有说明如下程序

#include<stdio.h> int main(){ float a[3]={1.0,2.0,3.0}; printf("%d",sizeof(a)); return 0; }

则输出的结果为 (    )

A. 3 B. 8 C. 24 D. 12

📌 答案

D. 12

💡 解析

本题考查 sizeof 运算符对数组的计算。

float a[3] 声明了一个包含 3 个 float 类型元素的数组。

在 C 语言中,sizeof(float) = 4 字节

因此 sizeof(a) = 3 × 4 = 12 字节

⚠️ 注意:sizeof 返回的是数组占用的总字节数,不是元素个数。若要获取元素个数,需用 sizeof(a)/sizeof(a[0])。

✏️巩固提高 — 第 2 题

选择题 字符数组初始化

对两个字符数组进行初始化,其中一个采用逐一赋值的形式,另一个采用直接字符串赋值,则下列对于这两个数组的比较说法正确的是 (    )

A. 逐一赋值的数组长度比直接字符串赋值的数组长度长 B. 两个数组长度完全相同 C. 直接字符串赋值的数组长度比逐一赋值的数组长度长 D. 两个数组其实一模一样,只是方式不同

📌 答案

C. 直接字符串赋值的数组长度比逐一赋值的数组长度长

💡 解析

本题考查字符数组的两种初始化方式的区别。

逐一赋值:char a[] = {'H','e','l','l','o'}; → 数组长度为 5,不包含 '\0'。

字符串赋值:char b[] = "Hello"; → 数组长度为 6,自动包含 '\0' 结束符。

因为字符串赋值会自动在末尾添加 '\0',所以直接字符串赋值的数组比逐一赋值的数组多一个元素

⚠️ 注意:如果逐一赋值时也手动加上 '\0',如 {'H','e','l','l','o','\0'},则两者长度相同。但题目中的"逐一赋值"一般指不加 '\0' 的情况。

✏️巩固提高 — 第 3 题

选择题 程序查错

下列程序中,有错误的行是 (    )

L1 #include<stdio.h> L2 main( ) L3 { int a[3] , i ; L4 a[3]={1,2,3} ; L5 for( i=1 ; i<3 ; i++ ) a[0]=a[0]+a[i] ; L6 printf( "%d" , a[0] ) ; L7 }
A. L3 B. L4 C. L5 D. L6

📌 答案

B. L4

💡 解析

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;

✏️巩固提高 — 第 4 题

选择题 函数指针调用

若有以下说明和定义,在必要的赋值之后,对 fun 函数的正确调用语句是 (    )

int fun ( int * c ){ … } int main( ){ int ( * x )( int * )= fun , * h( ) , s[ 10 ] , c ; … }
A. x = x(s); B. (*x)(&c); C. h = *h(s); D. fun(h);

📌 答案

B. (*x)(&c)

💡 解析

首先分析各声明含义:

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,&cint* 类型参数 → 参数匹配,调用正确 → 正确 ✓

C. h = *h(s); → h 是函数名(不是变量),不能被赋值 → 错误

D. fun(h); → fun 需要 int* 参数,但 h 是函数名,类型不匹配 → 错误

💡 函数指针调用两种写法等价:(*x)(&c) 和 x(&c) 都可以。

📝真题回顾 — 程序填空题

真题 程序填空题 二维数组

下列程序定义了 3×3 的二维数组,并在主函数中自动赋值;函数 fun 的功能是使二维数组的上三角元素的值全部置 0。

调用前
123
246
369
调用后
100
240
369
#include "stdio.h" main( ) { int i, j, a[3][3]; for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=i*3+j+1; // 自动赋值 1~9 fun(a); // 调用函数,上三角置0 for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%3d",a[i][j]); printf("\n"); } } /* fun 函数:将上三角元素置0 */ void fun(int a[3][3]) { int i, j; for(i=0;i<3;i++) for(j=_______;j<3;j++) // 填空1 a[i][j]=_______; // 填空2 }

📌 答案

填空1:i+1    填空2:0

💡 解析

本题考查二维数组上三角元素的判断与操作。

上三角元素的定义:对于矩阵元素 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。

📚知识点补充 — 一维数组

(1) 声明数组

在 C 语言中,声明一维数组需要指定数组的类型、名称和大小。

int arr[5];

(2) 初始化数组

在声明数组时,也可以对数组进行初始化:

int arr[5] = {1, 2, 3, 4, 5};

(3) 访问数组元素

可以使用下标运算符 [ ] 来访问数组中的元素。数组下标从 0 开始,最后一个元素的下标为数组长度减 1。

(4) 数组长度

可以使用 sizeof 运算符获取数组的长度:

sizeof(arr) / sizeof(arr[0]) // 返回元素个数

(5) 遍历数组

int i; for(i=0;i<5;i++){ printf("%d",arr[i]); }

(6) 数组作为函数参数

int sum(int arr[],int len){ int s=0, i; for(i=0;i<len;i++){ s+=arr[i]; } return s; } // 调用:sum(arr, 5)
本章小结

数组与指针

  • 一维数组:声明、初始化、遍历、sizeof
  • 二维数组:上三角/下三角操作
  • 指针与数组:p=a+2,指针算术
  • 函数指针:int (*x)(int*) = fun
  • 注意 i++ 在循环体与 for 中的叠加效应

多练真题 · 理解指针 · 熟能生巧

1 / 10
上一页 下一页