←

C 语言程序设计 · C语言

数组的定义和引用

数组的定义和引用

结构化讲义

S1-6 · 4 个大纲考点讲义 · 已精编

练本节题目

S1-6.1

一维数组的定义、初始化和数组元素的引用。

精编讲义 v1#

一维数组的定义、初始化与下标越界规则

必记
  • 定义语法:类型说明符 数组名[常量表达式];——方括号内的长度必须是正整型常量表达式(标准 C89 不允许用普通变量定义数组长度,如 int n=5; int a[n]; 判错)。
  • 初始化规则:① 全部初始化时可省略长度,如 int a[] = {1, 2, 3, 4};(数组长度自动定为 4,占 4*4=16 字节);② 部分初始化时,未赋初值的剩余元素自动补 0(如 int a[10] = {0}; 将全部 10 个元素清零);③ 局部数组若完全不初始化,各元素值为不确定的随机数;④ 初值个数绝不能超过数组定义长度。
  • 下标与引用:长度为 N 的数组,合法下标范围是 0 到 N - 1(a[N] 已属于下标越界!);C 语言不能用数组名整体输入输出普通整型数组,必须通过循环逐个元素访问。
  • 数组名的本质:一维数组名是代表首元素地址(&a[0])的地址常量,不能对其赋值或自增(如 a++ 或 a = b 均编译报错)。

一维数组部分初始化与 sizeof 计算元素个数

重点
c
#include <stdio.h>

int main(void) {
    int a[] = {10, 20, 30, 40};
    int b[5] = {1, 2};        /* b[0]=1, b[1]=2, b[2]~b[4] 自动补 0 */
    int len = (int)(sizeof(a) / sizeof(a[0]));
    printf("len=%d, b[4]=%d\n", len, b[4]);
    return 0;
}
随堂自测(3 题 · 共 156 道关联题)展开作答
单选2 分自测不计入学习进度

假定 int 类型变量占用两个字节,若有定义:int x[5]={1,2,3,4};,则数组 x 在内存中所占字节数是____。

单选2 分自测不计入学习进度

下列有关数组的叙述,正确的是()

判断1 分自测不计入学习进度

数组定义 int a[10],也可以写成 int a(10)。

S1-6.2

二维数组的定义、初始化和数组元素的引用。

精编讲义 v1#

二维数组按行存储、省行不省列与初始化对比

必记
  • 定义与省维铁律:类型名 数组名[行数][列数]; 在初始化时,第一维(行数)可以省略,但第二维(列数)绝对不能省略!例如 int a[][3] = {1, 2, 3, 4}; 合法(共 4 个元素,每行 3 列,自动折算为 2 行,占 2*3*4 = 24 字节);而 int a[2][] = {1,2,3,4}; 非法。
  • 按行优先顺序存储:内存中二维数组严格按先行后列顺序连续存放(先存 a[0][0], a[0][1]...,再存 a[1][0]...)。
  • 分行初始化 vs 连续初始化:int a[3][2] = {{1}, {2}, {3}}; 是给每行的第 0 列赋值(a[0][0]=1, a[1][0]=2, a[2][0]=3);而 int b[3][2] = {1, 2, 3}; 是按行顺序依次赋给 b[0][0]=1, b[0][1]=2, b[1][0]=3,其余补 0。

引用二维数组元素的下标写法陷阱

必记

易错陷阱

引用二维数组元素必须写成双中括号 a[i][j],绝不能写成数学矩阵式的 a[i, j]!在 C 语言中,a[i, j] 括号内是逗号表达式(值为 j),实际等价于行地址偏移 a[j],并非第 i 行第 j 列元素。

随堂自测(3 题 · 共 135 道关联题)展开作答
单选2 分自测不计入学习进度

对二维数组的正确定义是( )

填空2 分自测不计入学习进度

若有说明:int a[3][4]; 则 a[i][j] 前有 ____ 个元素。

单选2 分自测不计入学习进度

已定义 int a[][3]={1,2,3,4,5,6,7,8,9};,则 a[1][2]的初值为 。

S1-6.3

字符串与字符数组。

精编讲义 v1#

字符数组初始化与字符串结束标志 '\0'

必记
  • 字符串结束标志:C 语言没有专用字符串变量类型,用字符数组存放字符串,依靠 '\0'(ASCII 码为 0) 作为结束标志。
  • 两种初始化的字节数差异:char s1[] = "abc"; 自动在末尾补 '\0',因此 sizeof(s1) 为 4,strlen(s1) 为 3;而逐字符初始化 char s2[] = {'a', 'b', 'c'}; 不含 '\0',sizeof(s2) 为 3(不可直接对其调用 strlen 或 %s 打印)。
  • 字符数组不能直接用 = 赋值或用 == 比较内容:定义之后写 char s[10]; s = "hello"; 编译报错(必须用 strcpy(s, "hello"));比较两个字符串是否相等必须用 strcmp(s1, s2) 0,写 s1 s2 只是比较首地址!

常用字符串处理函数对照表(需 #include <string.h>)

必记
函数原型 / 用法功能说明高频考点与必记细节
strlen(s)求字符串有效长度从首地址数到第一个 '\0' 为止,不计入 '\0' 本身;如 strlen("a\0bc") 为 1
strcpy(dest, src)将 src(含 '\0')复制到 destdest 必须是足够大的字符数组,覆盖原有内容
strcat(dest, src)把 src 追加到 dest 末尾从 dest 原有的 '\0' 位置开始覆盖连接,末尾自动保留 '\0'
strcmp(s1, s2)自左向右逐字符按 ASCII 码比较s1 s2 返回 0==;遇首个不同字符若 s1[i] > s2[i] 返回正数,否则返回负数
gets(s) / puts(s)整行读入(含空格) / 输出并自动换行stdio.h 函数:gets 遇回车结束并把回车换成 '\0';puts 输出字符串后自动输出换行 '\n'
随堂自测(3 题 · 共 194 道关联题)展开作答
综合6 分自测不计入学习进度

判断两个字符串是否相等,应用()

填空2 分自测不计入学习进度

复制字符串的库函数是____,只写函数名即可.

填空2 分自测不计入学习进度

字符串连接函数____是将字符串s2连接到字符串s1的后面。

S1-6.4

使用一维数组解决批量数据查找或排序等问题。

精编讲义 v1#

四大常考数组算法核心模板与边界条件

必记
  • 最值查找(求最大值及下标):令初值 max = a[0], idx = 0;(切忌盲目设 max = 0,否则全负数数组会出错),然后 for (i = 1; i < n; i++) 逐个比较。
  • 冒泡排序(Bubble Sort):共进行 n - 1 趟(外层 i 从 0 到 n - 2),第 i 趟内层比较相邻元素 a[j] 与 a[j + 1](内层 j 从 0 到 n - 1 - i)。
  • 选择排序(Selection Sort):外层 i 从 0 到 n - 2,每趟在 i ~ n - 1 中找出最小元素下标 k,若 k != i 则将 a[i] 与 a[k] 交换(每趟最多交换 1 次)。
  • 折半查找(二分查找):前提是数组必须已按升序(或降序)排好序;维护 low = 0, high = n - 1,当 low <= high 时取 mid = (low + high) / 2 比较。

冒泡排序与折半查找标准 C 实现(程序填空高频母题)

必记
c
#include <stdio.h>

void bubble_sort(int a[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}

int binary_search(const int a[], int n, int key) {
    int low = 0, high = n - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (a[mid] == key) return mid;
        if (a[mid] < key) low = mid + 1;
        else high = mid - 1;
    }
    return -1;
}

int main(void) {
    int arr[5] = {9, 3, 7, 1, 5};
    bubble_sort(arr, 5);
    printf("index of 7: %d\n", binary_search(arr, 5, 7));
    return 0;
}
随堂自测(3 题 · 共 44 道关联题)展开作答
单选2 分自测不计入学习进度

25以下程序段的作用是______。 int a[]={4,0,2,3,1},i,j,t; for (i=1;i<5;i++) {t=a[i];j=i-1; while (j>=0&&t>a[j]) {a[j+1]=a[j];j- -;} a[j+1]=t; }

单选2 分自测不计入学习进度

在一个降序排列的数组中查找一个数 n,使用折半查找法效率低于顺序查找法,则 n 的值()。

填空2 分自测不计入学习进度

若有以下数组 a,数组元素:a[0]~a[9],其值为:9 4 12 8 2 10 7 5 1 3,该数组的元素中,数值最大的元素的下标值是 。