一、数组基础概念1. 数组定义数组是连续内存空间用于存储相同数据类型批量数据语法数据类型 数组名[常量表达式];数据类型int/char/float/结构体等决定单元素占用字节数组名遵循标识符命名规则注意[]内只能是常量不能用变量C99变长数组除外标准C不推荐int arr[10]; // 存放10个int总字节 10*440 char str[32]; // 存放32个字符 float f_arr[5]; // 5个单精度浮点数省略长度初始化写法定义时直接赋值编译器自动计算元素个数int a[] {1,2,3}; // 数组长度自动为32. 数组下标访问数组下标从0开始下标范围0~数组长度-1int arr[5] {10,20,30,40,50}; arr[0] 100; // 修改第一个元素 printf(%d, arr[2]); // 读取第三个元素数组越界下标超出合法范围内存乱访问程序异常崩溃3. 数组三大特性单一性全部元素数据类型完全相同有序性按下标0、1、2...顺序排列连续性内存地址连续分配4. 数组初始化规则全部初始化大括号列出所有元素int a[4] {1,2,3,4};局部初始化未赋值元素自动补0int a[5] {1,2}; // a[2]0,a[3]0,a[4]0全零初始化只写一个0所有元素置0int a[10] {0};无初始化局部数组存随机垃圾值全局/静态数组默认全05. sizeof求数组长度公式int arr[10]; int len sizeof(arr) / sizeof(arr[0]); // sizeof(arr)数组总字节 // sizeof(arr[0])单个元素字节注意数组作为函数形参时退化为指针该公式失效必须手动传长度二、一维整形数组1. 基础操作遍历输出数组int arr[5] {1,3,5,7,9}; int len sizeof(arr)/sizeof(arr[0]); for(int i0; ilen; i){ printf(%d , arr[i]); }2. 常用算法1选择排序思路固定待排序下标向后找最小值交换不稳定排序空间复杂度O(1)int a[10] {1,2,-3,-4,-5,6,7,8,-9,0}; int len sizeof(a)/sizeof(a[0]); for(int i0; ilen-1; i){ for(int ji1; jlen; j){ if(a[i] a[j]){ int tmp a[i]; a[i] a[j]; a[j] tmp; } } }2冒泡排序思路相邻两两比较交换每轮把最大值浮到末尾稳定排序int a[10] {1,-2,-3,4,5,6,7,8,-9,0}; int len sizeof(a)/sizeof(a[0]); for(int j0; jlen-1; j){ for(int i0; ilen-1-j; i){ if(a[i] a[i1]){ int tmp a[i]; a[i] a[i1]; a[i1] tmp; } } }3二分查找折半查找前提数组升序有序时间复杂度O(logn)int arr[] {1,3,5,7,9}; int len sizeof(arr)/sizeof(arr[0]); int num 7; int i0,jlen-1; while(i j){ int mid (ij)/2; if(num arr[mid]) i mid 1; else if(num arr[mid]) j mid - 1; else{ printf(找到%d\n, arr[mid]); break; } } if(ij) printf(未找到\n);三、一维字符数组1. 字符串本质以\0ASCII值0作为结束标记的字符数组// 方式1逐个字符赋值需手动加结束符 char str[5] {h,e,l,l,o}; // 无\0不是字符串 // 方式2字符串字面量自动末尾补\0 char str[6] hello; char str[] hello; // 长度自动为65字符1\02. strlen 与 sizeof 核心区分strlen(str)统计有效字符个数不包含\0需要#include string.hsizeof(str)统计数组总占用字节包含结束符、空余空间char str[20] hello; strlen(str); // 结果5 sizeof(str); // 结果203. 字符数组输入输出输出printf(%s, str)自动读到\0停止puts(str)输出字符串并自动换行输入scanf(%s, str)遇空格、Tab、回车停止读取无法读取带空格句子gets(str)危险函数无边界限制已被标准废弃fgets()安全读取整行推荐4. 四大字符串库函数strlen求字符串长度int mystrlen(char str[]) { int i0; while(str[i] ! \0) i; return i; }strcpy字符串拷贝void mystrcpy(char dst[], char src[]) { int i0; while(src[i] ! \0){ dst[i] src[i]; i; } dst[i] \0; }strcat字符串拼接void mystrcat(char dst[], char src[]) { int i0,j0; while(dst[i] ! \0) i; while(src[j] ! \0){ dst[i] src[j]; } dst[i] \0; }strcmp字符串逐字符比较返回差值int mystrcmp(char s1[], char s2[]) { int i0; while(s1[i]!\0 s2[i]!\0 s1[i]s2[i]) i; return s1[i] - s2[i]; }四、二维数组1. 定义语法数据类型 数组名[行数][列数];int arr[3][4]; // 3行4列共12个int元素内存存储行优先连续存放先存完一行再存下一行2. 初始化分行初始化可读性最高int a[3][4] {{1,2},{3,4,5},{6}};平铺初始化int a[3][4] {1,2,3,4,5,6};省略行数列不可省略编译器自动计算行数int a[][4] {1,2,3,4,5}; // 自动2行全零初始化int a[3][4] {0};3. 元素访问数组名[行下标][列下标]a[0][1] 100; // 第0行第1列下标换算a[m][n] *(*(am)n)4. 二维数组作为函数参数规则行数可省略列必须写明// 两种等价写法 void print2D(int arr[][4], int row); void print2D(int (*arr)[4], int row);行列计算int row sizeof(arr)/sizeof(arr[0]); // 总行数 int col sizeof(arr[0])/sizeof(arr[0][0]);// 总列数五、二维字符数组1. 作用一维字符数组存1个字符串二维字符数组同时存储多个字符串char names[3][20] { ZhangSan, LiSi, WangWu };内存占用3行×20字节 60字节2. 遍历读写// 输入 for(int i0; i3; i) gets(names[i]); // 输出 for(int i0; i3; i) puts(names[i]);六、数组与指针、函数配套规则数组名是地址常量不能赋值arr xxxarr arr[0]数组传参时自动退化为指针无法用sizeof求长度必须额外传参a[i]等价*(ai)指针与下标写法完全互通区分1二维字符数组保存字符串本体可修改内容2字符指针数组仅保存字符串常量地址不可修改字面量内容