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,写s1s2 只是比较首地址!
常用字符串处理函数对照表(需 #include <string.h>)
必记| 函数原型 / 用法 | 功能说明 | 高频考点与必记细节 |
|---|---|---|
strlen(s) | 求字符串有效长度 | 从首地址数到第一个 '\0' 为止,不计入 '\0' 本身;如 strlen("a\0bc") 为 1 |
strcpy(dest, src) | 将 src(含 '\0')复制到 dest | dest 必须是足够大的字符数组,覆盖原有内容 |
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,该数组的元素中,数值最大的元素的下标值是 。