C 语言入门学习Day08:字符数组与字符串全解 + 二维整型数组核心知识点

📅 2026/7/29 4:58:14
C 语言入门学习Day08:字符数组与字符串全解 + 二维整型数组核心知识点
文章目录前言一、一维字符型数组字符串的底层载体1. 核心特性2. 字符数组的定义3. 数组元素的访问4. 字符数组的存储5. 字符数组的初始化1全部初始化2局部初始化3默认初始化不指定长度6. 字符串的打印输出1printf %s2puts 函数7. 字符串的输入接收1scanf %s2gets 函数8. 字符串常见操作1字符串长度统计2字符串拷贝3字符串拼接4字符串比较二、二维整型数组1. 数组定义2. 数组元素访问3. 数组的存储4. 数组的本质理解5. 二维数组的初始化1全部初始化2局部初始化3默认初始化省略行数今日学习总结1. 核心知识梳理2. 踩坑心得前言今天是 C 语言学习的第八天核心内容围绕字符数组与字符串操作和二维整型数组展开。C 语言没有原生的字符串类型所有字符串的存储、遍历与修改都依赖字符数组实现这是后续 C 语言字符串处理、指针操作的核心基础同时我们也从一维数组延伸到二维数组学习其定义、存储规则与初始化语法。一、一维字符型数组字符串的底层载体1. 核心特性C 语言中没有专门的字符串类型字符串的存储与操作全部通过字符型数组实现。 一个合法的 C 语言字符串本质是一段连续的字符内存并且必须以转义字符\0作为结束标志。2. 字符数组的定义语法格式数据类型 数组名[元素个数];示例char str[20]; // 定义一个可存放20个char类型元素的数组注意规则元素个数必须是常量不能用变量指定数组长度数组空间必须足够要预留 1 个字节存放字符串结束标志\03. 数组元素的访问通过下标访问数组元素下标从 0 开始计数例如str[0]、str[1]…str[19]。通用数组长度计算公式所有类型数组通用int len sizeof(数组名) / sizeof(数组名[0]);4. 字符数组的存储字符数组所占总空间大小 数组元素个数 × char 类型大小1 字节因此 char 数组的sizeof数值等于元素个数内存在下标维度上连续存储\0是判断字符串结尾的唯一依据5. 字符数组的初始化⚠️ 重要概念初始化 ≠ 赋值初始化是在数组定义时给初值赋值是定义后修改内容。1全部初始化三种写法完全等价都会自动包含结尾\0char str[6] {h, e, l, l, o, \0}; char str[6] {hello}; char str[6] hello;2局部初始化未显式赋值的元素系统自动初始化为 0即\0char str[6] {h, e, l}; char str[6] {hel}; char str[6] hel; char str[6] {0}; // 所有元素全部初始化为0★ 易混淆概念辨析高频易错点符号含义ASCII 值作用数值 0整数 00等价于\0可作字符串结束符\0转义字符0字符串专属结束标志0字符 048普通可打印字符无结束作用3默认初始化不指定长度数组长度由初始化内容自动确定char str[] {h, e, l, \0}; char str[] {hel}; char str[] hel;6. 字符串的打印输出1printf%schar str[20] hello world; printf(str %s\n, str);规则从数组首地址开始打印直到遇到\0停止。2puts函数char str[20] hello world; puts(str);特点输出字符串后自动追加一个换行符\n无需手动写\n。7. 字符串的输入接收1scanf%schar str[32] {0}; scanf(%s, str);注意%s遇到空格、回车、制表符就会停止读取无法读取带空格的字符串数组名前面不需要加2gets函数char str[32] {0}; gets(str);特点可以读取带空格的字符串遇到回车停止。8. 字符串常见操作所有字符串库函数均需引入头文件string.h。1字符串长度统计库函数strlen功能统计从首地址到\0之间的有效字符个数不包含\0。char str[32] hello; int len strlen(str); // len 5★ 高频易错对比strlen统计字符串有效长度遇到\0结束和数组总大小无关sizeof计算数组占用的总内存空间大小和字符串内容无关2字符串拷贝库函数strcpychar str[32] {0}; strcpy(str, hello world);注意目标数组空间必须足够容纳源字符串含\0否则会发生内存越界。3字符串拼接库函数strcatchar str1[32] hello; char str2[32] world; strcat(str1, str2); // 结果str1 helloworld注意目标数组必须有足够的剩余空间容纳拼接后的完整字符串 结束符。4字符串比较库函数strcmpint ret strcmp(str1, str2);返回值规则等于 0两个字符串完全相等大于 0第一个字符串 第二个字符串小于 0第一个字符串 第二个字符串比较规则从左到右逐个字符按 ASCII 码比较出现不同字符时立即得出结果和字符串总长度无关。二、二维整型数组1. 数组定义语法格式数据类型 数组名[行数][列数];示例int a[2][3]; // 定义2行3列的整型数组规则行数、列数都必须是常量表达式。2. 数组元素访问语法数组名[行下标][列下标]下标从 0 开始行下标范围0 ~ 行数-1列下标范围0 ~ 列数-1。例如a[0][0]表示第 0 行第 0 列的元素a[1][2]表示第 1 行第 2 列的元素。3. 数组的存储总空间大小 数据类型大小 × 行数 × 列数存储规则逐行连续存储先存第 0 行的所有列再存第 1 行依次类推整体在内存中是连续的线性空间。4. 数组的本质理解二维数组可以理解为「元素是一维数组的一维数组」以此类推N 维数组可以看作由 N-1 维数组构成的一维数组。5. 二维数组的初始化1全部初始化// 平铺写法 int a[2][3] {1, 2, 3, 4, 5, 6}; // 按行分组写法结构更清晰推荐 int a[2][3] {{1, 2, 3}, {4, 5, 6}};2局部初始化未显式赋值的元素自动补 0int a[2][3] {1, 2, 3, 4}; int a[2][3] {{1, 2}, {3}}; int a[2][3] {0}; // 所有元素初始化为0 int a[2][3] {{0}}; // 所有元素初始化为03默认初始化省略行数int a[][3] {1, 2, 3, 4, 5, 6}; int a[][3] {1, 2, 3, 4}; int a[][3] {{1, 2}, {3}};★ 核心规则二维数组初始化时行数可以省略列数绝对不能省略系统会根据总元素数和列数自动计算行数。今日学习总结1. 核心知识梳理字符数组是 C 语言字符串的底层载体\0是字符串的核心标志所有字符串操作都依赖它判断结尾这是字符串最核心的本质。严格区分sizeof和strlen前者计算数组总内存空间后者统计字符串有效字符数二者概念完全不同不能混用。二维数组按行连续存储初始化时「行可省、列不可省」是固定语法规则。字符串库函数strlen/strcpy/strcat/strcmp都依赖string.h头文件使用时必须关注目标空间大小防止内存越界。2. 踩坑心得手写字符串操作时最容易忽略两个细节① 任何拷贝、拼接操作结束后必须手动给字符串追加\0② 输出字符串时传入数组首地址即可不要用单个元素作为%s的参数