2.C语言--数组
一、数组基本概念数组是多个相同类型元素的集合可以一次性创建多个同类型变量统一管理批量数据属于自定义类型。二、一维数组的创建方式语法格式:数据类型 数组名【常量表达式】intarr[10];[] 内必须是整型常量代表数组元素个数VS 不支持变长数组C99标准支持变长数组变量做数组长度三、数组访问方式通过 下标索引 访问下标从 0 开始 0、1、2、3…示例arr[2]5;[ ] 是双目操作符四、数组初始化规则完全初始化指定长度所有元素全部赋值或省略长度由编译器自动推导intarr1[5]{1,2,3,4,5};intarr2[]{10,20,30,40};不完全初始化初始化值数量少于数组长度未初始化元素默认置 0整型默认 0字符型默认 \0浮点型默认 0.000000intarr[5]{1,2};//剩余三个自动为0清零初始化intarr[10]{0};字符数组特殊规则{} 逐个字符初始化 不会自动补 \0“” 字符串初始化 末尾自动补 \0五、字符数组与字符串区别字符数组单纯存放字符无结束标志字符串以 \0 作为结束标志的字符数组sizeof 与 strlen 区别sizeof 计算数组总字节数包含 \0strlen 计算有效字符长度遇到\0停止、不包含\0使用 strlen 需要头文件 #includestring.h示例对比chararr[]{a,b,c,d,e,\0};//sizeof6chararr1[]abcdef;//sizeof7strlen6六、数组长度计算公式数组总字节数 ÷ 单个元素字节数 元素个数intsizesizeof(arr)/sizeof(arr[0]);七、数组重要禁忌规则数组绝对不能越界访问会产生随机值、程序报错数组名不能直接赋值给另一个数组arr2 arr1; 写法错误数组名代表首元素地址不可修改八、数组名特性数组名 默认为首元素地址普通访问数组元素 不需要取地址 九、一维数组内存存储特点数组元素在内存中 连续存放每个数组元素单独占用对应类型字节空间内存单元有唯一地址编号十、一维数组经典算法冒泡排序含优化核心逻辑外层循环控制排序趟数内层循环控制每趟比较次数优化一趟没有交换说明数组已经有序直接跳出完整代码intarr[]{7,4,3,5,6,8,1,2};intsizesizeof(arr)/sizeof(arr[0]);for(inti0;size-1;i){intflag0;for(intj0;jsize-1-i;j){if(arr[j]arr[j1]){inttmparr[j];arr[j]arr[j1];arr[j1]tmp;flag1;}}if(flag0)break;}二分查找折半查找前提数组必须有序核心变量left左边界right右边界mid中间下标完整代码intsortedArr[]{1,2,3,5,6,8,43,75};intsizesizeof(sortedArr)/sizeof(sortedArr[0]);inttarget6;intleft0;intrightsize-1;intresult-1;whileright){intmidleft(right-left)/2;if(sortedArr[mid]target){resultmid;break;}elseif(sortedArrtarget)leftmid1;elserightmid-1;}十一、二维数组知识点创建格式intarr[4][5];//4行5列核心特点二维数组在内存中 连续存储可以省略行数不能省略列数四种初始化方式分行初始化intarr[2][3]{{1,2,3},{4,5,6}};整体顺序初始化intarr[2][3]{1,2,3,4,5,6};不完全初始化未赋值默认0intarr[2][3]{{1},{4,5}};省略行数初始化编译器自动计算行数intarr[][3]{1,2,3,4,5};十二、补充全局知识点数组属于自定义类型数组不能整体赋值只能遍历赋值字符数组不加 \0 strlen 会越界乱读值初始化空间必须足够避免内存异常十三、数组练习题删除指定数先输入10个数字存在数组中输入一个整数n删除等于n的数字剩余在最前面后面的依次覆盖前面删除一个只看前九个(数组的有效元素个数-1)外循环如果进行了删除操作i不变intmain(){intarr[10]{1,1,2,2,3,1,2,2,4,2};intsizesizeof(arr)/sizeof(arr[0]);inti0;intn0;scanf(%d,n);while(isize){if(arr[i]n){intji1;while(jsize){arr[j-1]arr[j];j;}size--;}else{i;}}for(inti0;isize-1;i){printf(%d,arr[i]);}}合并两个升序排列的数组#includestdio.hintmain(){// 两个有序升序数组intarr1[]{1,2,3,4,5};intarr2[]{1,3,4,5,6};// 存放合并结果的数组intarr3[10]{0};inti0;// arr1下标intj0;// arr2下标intk0;// arr3下标// 计算两个数组元素个数intsz1sizeof(arr1)/sizeof(arr1[0]);intsz2sizeof(arr2)/sizeof(arr2[0]);// 双指针同步遍历取较小值放入新数组while(isz1jsz2){if(arr1[i]arr2[j]){arr3[k]arr1[i];i;}else{arr3[k]arr2[j];j;}k;}// 把arr1剩余元素全部移入结果数组while(isz1){arr3[k]arr1[i];i;k;}// 把arr2剩余元素全部移入结果数组while(jsz2){arr3[k]arr2[j];j;k;}// 遍历打印合并后的有序数组for(i0;ik;i){printf(%d ,arr3[i]);}return0;}杨辉三角每个数都是他左上方和右上方之和#includestdio.hintmain(){inti0;intj0;intarr[10][10];// 生成杨辉三角for(i0;i10;i){arr[i][0]arr[i][i]1;for(j1;ji;j){arr[i][j]arr[i-1][j-1]arr[i-1][j];}}// 打印输出for(i0;i10;i){for(j0;ji;j){printf(%-6d,arr[i][j]);}printf(\n);}return0;}