第五章:数组
文章目录
- 第五章:数组
- 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 语言集训营学习过程中所记录的学习笔记,梳理了核心知识点,同时也记录了本人实操验证的代码案例,供后续学习复盘使用。