思维导图
一、数组的特点
数组是用于连续存储多个同种数据类型数据的结构
二、一维整形数组
【1】定义
数据类型 数组名[长度];
//长度指的是数组中元素的个数
int arr[4];
【2】数组中元素访问
数组名[下标];
//数组中元素的下标从0开始最大到长度-1
【3】初始化和赋值
#include<myhead.h>
int main(int argc, const char *argv[])
{
//定义了一个能存5个整形数据的数组arr,随机生成值
int arr[5];
//完全初始化
int arr1[5]={1,4,6,8,10};
//不完全初始化,未初始化的部分,默认为0
int arr2[4]={3,6};
printf("%d\n",arr2[2]);
//给arr数组中的元素赋值
arr[0]=2;
arr[1]=4;
arr[2]=6;
arr[3]=8;
printf("%d\n",arr[0]);
return 0;
}
【4】数组越界*
访问不属于数组的空间
- 随机值
- 段错误
例子:
定义一个数组,使用循环,完成对数组中元素的终端输入和输出
#include<myhead.h>
int main(int argc, const char *argv[])
{
int i,j;
int arr[4];
for(i=0;i<4;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<4;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
【5】数组的大小和长度
长度:sizeof(arr)/sizeof(arr[0])
大小:个数*单个元素的大小
例子:
#include<myhead.h>
int main(int argc, const char *argv[])
{
int arr[4];//定义数组
int b=0;
//利用for循环给数组赋值
for(int i=0;i<4;i++)
{
scanf("%d",&arr[i]);
}
//用for循环计算数组之和
for(int i=0;i<4;i++)
{
b=b+arr[i];
}
//输出
printf("和为%d\n",b);
printf("平均值为%d\n",b/4);
return 0;
}
【6】冒泡排序
冒泡排序是一个排序算法,思想:相邻的两个元素,两两比较
排序需要排长度-1次
例子:
#include<myhead.h>
int main(int argc, const char *argv[])
{
int arr[]={12,9,45,7,34,73};
int len=sizeof(arr)/sizeof(arr[0]);
int i,j=0;
int a=0,b=0;
//外层循环控制排序次数,n个数排n-1次
for (int i=1;i<len ; i++)
{
//内层循环控制相邻元素比较
for(int j=0;j<len-i;j++)
{
//判断相邻两个数的大小关系
if(arr[j]>arr[j+1])
{
b=arr[j];
arr[j]=arr[j+1];
arr[j+1]=b;
}
}
}
for(int i=0;i<len;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
【7】选择排序
逻辑:
每次从待排序序列中找到最大/最小的元素和待排序序列中的第一个元素交换
例子:
#include<myhead.h>
int main(int argc, const char *argv[])
{
int arr[]={4,35,24,5,9,2};
int len = sizeof(arr)/sizeof(arr[0]);
int min,i,j;
int a=0;
//外层控制排序次数
for(i=1;i<len;i++)
{
min=i-1;
for(j=i;j<len;j++)
{
if(arr[j]<arr[min])
{
//更新最小值下标
min=j;
}
}
//退出内层循环说明找到了最小值
//判断是否是待排序序列中的第一个元素
if(min!=i-1)
{
a=arr[min];
arr[min]=arr[i-1];
arr[i-1]=a;
}
}
for (i=1; i<len; i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
三、一维字符数组
【1】定义
char 数组名[长度];
C语言中不提供字符串类型,所以常常用字符数组存储字符串
【2】初始化和赋值
方法一:使用字符初始化
方法二:使用字符串给字符数组初始化
#include <stdio.h>
int main(int argc, const char *argv[])
{
//完全初始化
char arr[3]={'a','b','c'};
//不完全初始化,未初始化的部分默认为0
char arr1[5]={'a','b','c'};
//不给长度的初始化,需要给'\0'预留出空间
char str[] = "hello"; //使用字符串给字符数组初始化时,注意要给结尾的'\0'预留出空间
char str1[2] = "hi";
printf("%ld\n",sizeof(str));
int i = 0;
while(str[i]) //等价于str[i]!=0
{
putchar(str[i]);
i++;
}
return 0;
}
作业:
定义一个有10个元素的数组,终端输入学生成绩,将成绩排序后输出
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[10];
int len = sizeof(arr) / sizeof(arr[0]);
int i, j, temp;
//输入数据(从 0 开始存储)
for (i = 0; i < len; i++)
{
printf("输入第 %d 个成绩:", i + 1);
scanf("%d", &arr[i]);
}
//冒泡排序(外层循环控制轮数,内层循环比较相邻元素)
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
// 输出排序后的结果(从 0 开始输出)
printf("\n排序后的成绩:\n");
for (i = 0; i < len; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
输出结果:

终端输入一串字符,以'#'结束,统计大写字母、小写字母和数字字符的个数
#include<myhead.h>
int main(int argc, const char *argv[])
{
char arr[100];//定义数组
int i,j;
int a=0,b=0,c=0;
printf("请输入一串字符,以‘#’结束:\n");//输入
for(i=1;i<100;i++)
{
arr[i]=getchar();//吸取字符,赋值给arr[i]
if(arr[i]=='#')
{
break;
}
//计算小写字母个数
if(arr[i]>='a'&&arr[i]<='z')
{
a++;
}
//计算大写字母个数
else if(arr[i]>='A'&&arr[i]<='Z')
{
b++;
}
//计算数字字符个数
else if(arr[i]>='0'&&arr[i]<='9')
{
c++;
}
}
//输出
printf("小写字母有%d个,大写字母有%d个,数字字符有%d个\n",a,b,c);
return 0;
}
输出结果: