news 2026/4/18 8:38:19

C 语言学习历程:(第五章)数组・编程中的批量数据容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言学习历程:(第五章)数组・编程中的批量数据容器

第五章:数组

文章目录

  • 第五章:数组
    • 1. 一维数组
      • 1.1 一维数组的创建和初始化
      • 1.2 数组的类型
      • 1.3 一维数组的输入与输出
    • 2. 二维数组
      • 2.1 二维数组初始化
      • 2.2 二维数组输入与输出
    • 3. 数组练习
      • 3.1 多个字符从两端移动,向中间汇聚
      • 3.2 二分查找
  • 声明

数组是一组相同类型元素的集合

  • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
  • 数组中存放的多个数据,类型是相同的

1. 一维数组

1.1 一维数组的创建和初始化

  • 数组类型 数组名[数组大小]
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//第五章:数组//数组创建和初始化intmain(){//创建数组intarr1[5];//不初始化,存储的是随机值//初始化数组intarr2[5]={1,2,3,4,5};//完全初始化:数组的元素个数和数组长度一致intarr3[10]={1,2,3,4,5};//不完全初始化:数组的元素个数少于数组长度,则剩余的元素将会初始化为 0intarr4[]={1,2,3,4,5};//当不指定数组长度时,会根据初始化内容来确定数组长度//字符数组初始化//当字符数组不完全初始化时,剩余的元素初始化为 '\0'//字符数组可以直接使用字符串初始化charstr1[10]="hello";//也可以通过字符初始化charstr2[10]={'h','e','l','l','o'};//当字符数组不指定长度时charstr3[]="hello";//此时会自动在末尾添加 '\0',所以 str4 的长度是 6charstr4[]={'h','e','l','l','o'};//不会带\0,长度是5return0;}

数组在初始化时,如果是不完全初始化,剩余元素会根据数组类型进行初始化

1.2 数组的类型

在数组中,去掉变量名就是数组类型。

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//数组类型//在数组中,去掉变量名就是数组类型 例如 int arr[10];数组类型是 int [10]intmain(){intarr[10];//前文学习过 sizeof(),计算在内存中的字节长度。参数支持变量,表达式,和类型printf("%zd\n",sizeof(arr));//此时输出的是 40,因为 int arr[10],存放十个元素,每个元素都是四个字节printf("%zd\n",sizeof(int[10]));//所以我们可以利用 sizeof 来计算数组的长度intsz=sizeof(arr)/sizeof(arr[0]);//数组总共的长度 / 一个元素的长度printf("%d",sz);return;}

1.3 一维数组的输入与输出

数组在内存中是连续存放的。数组的下标从 0 开始,最后一个元素的下标是 n-1,下标相当于数组元素的编号。通过下标引用操作符[]来访问数组的元素。

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//一维数组的使用intmain(){//数组输入和输出charstr1[11];//字符数组可以直接输入,不用通过下标。//在底层,输入的字符串(不能有空白字符)会被读取,根据顺序存放到对应的下标中//在此处也不需要元素地址值 & str[i]scanf("%10s",str1);//字符数组可以直接打印,printf 函数根据变量自动找到相对应的地址//字符数组在底层中直接存储的就是完整的字符串//而其他数组存储的是列表,所以需要 for 循环打印printf("%s\n",str1);//字符数组输入第二种写法测试charstr2[10];//输入数据for(inti=0;i<9;i++)// 此时需要 < 9,只输入 9 个元素,最后一个留给 \0{scanf("%s",&str2[i]);}//输出数据printf("%s",str2);intarr[3];//输入数据for(inti=0;i<3;i++){//将输入的元素,放在 arr[i] 中,数组本身就是地址//但是在此处不是数组, arr[i] 是元素,所以需要 &arr[i] 取元素的地址scanf("%d",&arr[i]);}for(inti=0;i<3;i++){printf("%d ",arr[i]);}return0;}

2. 二维数组

  • 数据类型 数组名[一维数组个数][一维数组大小]

将一维数组做为元素的数组称为二维数组。二维数组中的每个元素在内存中也是连续存放的。

2.1 二维数组初始化

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//二维数组初始化intmain(){//定义数组两行三列,//建议 arr1[2][3] 理解为,此时二维数组存放两个一维数组,每个一维数组存放三个元素//因为在内存中,二维数组也是连续存放的,靠指针进行读取intarr1[2][3]={1,2};//不完全初始化intarr2[2][3]={1,2,3,2,3,4};//完全初始化intarr3[2][3]={{1},{2,3}};//按行初始化,第一行读取1,第二行读取2和3//初始化可以省略行,不能省略列(根据元素个数来推断几行)intarr4[][3]={1,2};//3列可以存储两个元素,所以只会有一行intarr5[][3]={1,2,3,4,5};//两行intarr6[][3]={{1},{2,3},{4,5}};//三行,此时将不会根据元素个数来推断行return0;}

2.2 二维数组输入与输出

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//二维数组输入输出intmain(){intarr[2][3];//定义数组//输入//第一层循环是遍历行//行数 = 二维数组的总大小 / 一行元素的大小for(inti=0;i<sizeof(arr)/sizeof(arr[0]);i++)// arr[0]代表一行的元素{//第二层循环是遍历列//列数 = 二维数组的总大小 / (一列元素的大小 (行数 * 二维数组的一个元素) )for(intj=0;j<sizeof(arr)/((sizeof(arr)/sizeof(arr[0])*sizeof(arr[0][0])));j++){scanf("%d",&arr[i][j]);//此时 arr[i][j]是元素本身,不是地址,需要取地址}}//输出//第一层循环是遍历行for(inti=0;i<sizeof(arr)/sizeof(arr[0]);i++)//{//第二层循环是遍历列for(intj=0;j<sizeof(arr)/((sizeof(arr)/sizeof(arr[0])*sizeof(arr[0][0])));j++){printf("%d ",arr[i][j]);}printf("\n");//一行输出结束换行}return0;}

3. 数组练习

3.1 多个字符从两端移动,向中间汇聚

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<windows.h>//数组练习//多个字符从两端移动,向中间汇聚intmain(){//定义字符数组chararr1[]="welcome to bit!!!!!!";chararr2[]="********************";intleft=0;//左指针//计算元素个数:sizeof(arr) / sizeof(arr[0]),但是字符数组末尾还有一个 \0//所以字符数组元素个数:sizeof(arr) / sizeof(arr[0]) -1//或者 strlen 统计字符串长度,忽略 \0intright=strlen(arr1)-1;//右指针while(left<=right){//当两个指针指向的下标相等,赋值一个即可if(left==right){arr2[left]=arr1[left];}//利用左指针替换arr2的内容arr2[left]=arr1[left];//利用右指针替换arr2的内容arr2[right]=arr1[right];left++;//移动左指针right--;//移动右指针system("cls");//清理屏幕Sleep(500);//打印完睡眠观察效果,单位一千毫秒printf("%s\n",arr2);}return0;}

3.2 二分查找

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdbool.h>//二分查找(折半查找),每次处理一半的数据提高效率//前提条件有序intmain(){//定义数组intarr[10]={1,2,3,4,5,6,7,8,9,10};//定义变量接受用户输入的值intnum=0;printf("请输入数字:");scanf("%d",&num);intleft=0;//左指针intright=sizeof(arr)/sizeof(arr[0])-1;//右指针intmid=0;//中间变量下标,用于移动左指针或右指针bool flag=false;//定义变量用于判断是否找到while(left<=right){//移动中间变量mid=(left+right)/2;if(num==arr[mid]){printf("数字下标为:%d",mid);flag=true;break;}elseif(num>arr[mid]){left=mid+1;//左指针移动到中间变量后一位}else{right=mid-1;//右指针移动到中间变量前一位}}if(!flag)//如果 flag 为假则没找到{printf("输入的数字不在数组内");}return0;}

第六章:函数

声明

本文是在鹏哥 C 语言集训营学习过程中所记录的学习笔记,梳理了核心知识点,同时也记录了本人实操验证的代码案例,供后续学习复盘使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 20:16:06

如何通过FontCenter实现AutoCAD字体管理自动化

如何通过FontCenter实现AutoCAD字体管理自动化 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 在AutoCAD设计工作中&#xff0c;字体缺失导致的图纸显示异常、团队协作时的字体版本混乱、以及手动管理字…

作者头像 李华
网站建设 2026/4/18 7:50:11

从下载到出图,Qwen-Image-2512-ComfyUI全流程演示

从下载到出图&#xff0c;Qwen-Image-2512-ComfyUI全流程演示 1. 这不是又一个“点开即用”的镜像——它真能跑起来 你可能已经试过十几个ComfyUI镜像&#xff1a;有的卡在启动界面&#xff0c;有的报错说显存不足&#xff0c;有的工作流点开就红标满屏……而Qwen-Image-2512…

作者头像 李华
网站建设 2026/4/17 15:23:48

动态分块处理在图像生成工作流中的架构演进与实践

动态分块处理在图像生成工作流中的架构演进与实践 【免费下载链接】ComfyUI-Impact-Pack 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Impact-Pack 现象观察&#xff1a;分块处理的效率困境 在现代AI图像生成工作流中&#xff0c;高分辨率图像的细节优化一直…

作者头像 李华
网站建设 2026/4/17 22:52:25

Qwen3Guard-Gen-WEB推理速度慢?3种优化策略实战分享

Qwen3Guard-Gen-WEB推理速度慢&#xff1f;3种优化策略实战分享 1. 为什么Qwen3Guard-Gen-WEB会“卡”在加载界面&#xff1f; 你刚部署完Qwen3Guard-Gen-8B镜像&#xff0c;点开网页端&#xff0c;输入一段文本&#xff0c;点击发送——然后光标转圈、进度条停住、控制台日志…

作者头像 李华
网站建设 2026/4/17 22:48:23

三步打造专业级歌词体验:ESLyric歌词增强工具完全指南

三步打造专业级歌词体验&#xff1a;ESLyric歌词增强工具完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 问题引入&#xff1a;为什么你的歌词显…

作者头像 李华