2.C语言--数组
2026/7/13 1:31:13 网站建设 项目流程

一、数组基本概念

数组是多个相同类型元素的集合,可以一次性创建多个同类型变量,统一管理批量数据,属于自定义类型。

二、一维数组的创建方式

语法格式:数据类型 数组名【常量表达式】;

intarr[10];
  • [] 内必须是整型常量,代表数组元素个数
  • VS 不支持变长数组
  • C99标准支持变长数组(变量做数组长度)

三、数组访问方式

  • 通过 下标(索引) 访问
  • 下标从 0 开始: 0、1、2、3…
  • 示例:
arr[2]=5;

[ ] 是双目操作符

四、数组初始化规则

  1. 完全初始化
    指定长度,所有元素全部赋值,或省略长度由编译器自动推导
intarr1[5]={1,2,3,4,5};intarr2[]={10,20,30,40};
  1. 不完全初始化
    初始化值数量少于数组长度,未初始化元素默认置 0
  • 整型默认: 0
  • 字符型默认: \0
  • 浮点型默认: 0.000000
intarr[5]={1,2};//剩余三个自动为0
  1. 清零初始化
intarr[10]={0};
  1. 字符数组特殊规则
  • {} 逐个字符初始化 不会自动补 \0
  • “” 字符串初始化 末尾自动补 \0

五、字符数组与字符串区别

  1. 字符数组:单纯存放字符,无结束标志
  2. 字符串:以 \0 作为结束标志的字符数组

sizeof 与 strlen 区别

  • sizeof :计算数组总字节数,包含 \0
  • strlen :计算有效字符长度,遇到\0停止、不包含\0
  • 使用 strlen 需要头文件 #include<string.h>

示例对比:

chararr[]={'a','b','c','d','e','\0'};//sizeof=6chararr1[]="abcdef";//sizeof=7,strlen=6

六、数组长度计算公式

数组总字节数 ÷ 单个元素字节数 = 元素个数

intsize=sizeof(arr)/sizeof(arr[0]);

七、数组重要禁忌规则

  1. 数组绝对不能越界访问,会产生随机值、程序报错
  2. 数组名不能直接赋值给另一个数组
    arr2 = arr1; 写法错误
  3. 数组名代表首元素地址,不可修改

八、数组名特性

  • 数组名 默认为首元素地址
  • 普通访问数组元素 不需要取地址 &

九、一维数组内存存储特点

  • 数组元素在内存中 连续存放
  • 每个数组元素单独占用对应类型字节空间
  • 内存单元有唯一地址编号

十、一维数组经典算法

  1. 冒泡排序(含优化)

核心逻辑:

  • 外层循环:控制排序趟数
  • 内层循环:控制每趟比较次数
  • 优化:一趟没有交换,说明数组已经有序,直接跳出

完整代码:

intarr[]={7,4,3,5,6,8,1,2};intsize=sizeof(arr)/sizeof(arr[0]);for(inti=0;<size-1;i++){intflag=0;for(intj=0;j<size-1-i;j++){if(arr[j]>arr[j+1]){inttmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;flag=1;}}if(flag==0)break;}
  1. 二分查找(折半查找)

前提:数组必须有序
核心变量:

  • left:左边界
  • right:右边界
  • mid:中间下标

完整代码:

intsortedArr[]={1,2,3,5,6,8,43,75};intsize=sizeof(sortedArr)/sizeof(sortedArr[0]);inttarget=6;intleft=0;intright=size-1;intresult=-1;while<=right){intmid=left+(right-left)/2;if(sortedArr[mid]==target){result=mid;break;}elseif(sortedArr<target)left=mid+1;elseright=mid-1;}

十一、二维数组知识点

  1. 创建格式
intarr[4][5];//4行5列
  1. 核心特点
  • 二维数组在内存中 连续存储
  • 可以省略行数,不能省略列数
  1. 四种初始化方式
  • 分行初始化
intarr[2][3]={{1,2,3},{4,5,6}};
  • 整体顺序初始化
intarr[2][3]={1,2,3,4,5,6};
  • 不完全初始化(未赋值默认0)
intarr[2][3]={{1},{4,5}};
  • 省略行数初始化(编译器自动计算行数)
intarr[][3]={1,2,3,4,5};

十二、补充全局知识点

  1. 数组属于自定义类型
  2. 数组不能整体赋值,只能遍历赋值
  3. 字符数组不加 \0 , strlen 会越界乱读值
  4. 初始化空间必须足够,避免内存异常

十三、数组练习题

  1. 删除指定数
    先输入10个数字,存在数组中,输入一个整数n,删除等于n的数字,剩余在最前面;
    后面的依次覆盖前面,删除一个,只看前九个(数组的有效元素个数-1);
    外循环,如果进行了删除操作,i不变;
intmain(){intarr[10]={1,1,2,2,3,1,2,2,4,2};intsize=sizeof(arr)/sizeof(arr[0]);inti=0;intn=0;scanf("%d",&n);while(i<size){if(arr[i]==n){intj=i+1;while(j<size){arr[j-1]=arr[j];j++;}size--;}else{i++;}}for(inti=0;i<=size-1;i++){printf("%d",arr[i]);}}
  1. 合并两个升序排列的数组
#include<stdio.h>intmain(){// 两个有序升序数组intarr1[]={1,2,3,4,5};intarr2[]={1,3,4,5,6};// 存放合并结果的数组intarr3[10]={0};inti=0;// arr1下标intj=0;// arr2下标intk=0;// arr3下标// 计算两个数组元素个数intsz1=sizeof(arr1)/sizeof(arr1[0]);intsz2=sizeof(arr2)/sizeof(arr2[0]);// 双指针同步遍历,取较小值放入新数组while(i<sz1&&j<sz2){if(arr1[i]<arr2[j]){arr3[k]=arr1[i];i++;}else{arr3[k]=arr2[j];j++;}k++;}// 把arr1剩余元素全部移入结果数组while(i<sz1){arr3[k]=arr1[i];i++;k++;}// 把arr2剩余元素全部移入结果数组while(j<sz2){arr3[k]=arr2[j];j++;k++;}// 遍历打印合并后的有序数组for(i=0;i<k;i++){printf("%d ",arr3[i]);}return0;}
  1. 杨辉三角
    每个数都是他左上方和右上方之和;
#include<stdio.h>intmain(){inti=0;intj=0;intarr[10][10];// 生成杨辉三角for(i=0;i<10;i++){arr[i][0]=arr[i][i]=1;for(j=1;j<i;j++){arr[i][j]=arr[i-1][j-1]+arr[i-1][j];}}// 打印输出for(i=0;i<10;i++){for(j=0;j<=i;j++){printf("%-6d",arr[i][j]);}printf("\n");}return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询