【数组】【重中之重】
1.生活中数组的概念
开发中的定义:存储多个相同类型的数据的连续性空间叫做数组
生活中停车场的案例:
分析停车场案例:
- 车位都是连续的
- 每一个区域都有一个编号,而且每个车位也有一个编号
- 确定具体车位可以根据区域号+数字编号来确定,例如A5 B3 C4
数组分析:
- 数组空间是连续的
- 存放的数据,数据类型一致
- 定位到数组里面的某一个元素,可以通过数组名+编号(下标)来确定
- 数组名:后续在指针中会着重强调!!!
2.C/C++中数组定义格式
数据类型 数组名[容量]={初始化元素}; // int arry[5]={10,20,30,40,50};
- 数据类型:规定数组里所存放数据的数据类型 ,注意数据类型一致性问题。
- 数组名:arry 见名知意,约定俗成,动宾结构
- 容量:数组所能存储的数据的个数,后续配合数组下标使用,数组的下标从0开始到容量-1结束
- 初始化赋值:数组定义的时候需要进行初始化赋值,如果不进行初始化赋值,后面会出现野值问题
3.数组定义案例和使用
int arry[5]={10,20,30,40,50};
printf("arr[0]=%d\n",arry[0]);
printf("arr[1]=%d\n",arry[1]);
printf("arr[2]=%d\n",arry[2]);
printf("arr[3]=%d\n",arry[3]);
printf("arr[4]=%d\n",arry[4]);
char char_arry[5] = {'H', 'E', 'L', 'L', 'O'};
printf("char_arry[2]%c\n", char_arry[2]);
printf("%c", char_arry[0]);
printf("%c", char_arry[1]);
printf("%c", char_arry[2]);
printf("%c", char_arry[3]);
printf("%c", char_arry[4]);
数组的容量初始化赋值
int arry[5] = {10, 20, 30, 40, 50}; //规定了数组可以存储5个int类型的数据,而且都进行了初始化赋值
printf("sizeof(arry)=%lu\n",sizeof(arry)); //20
int arry2[]={10,20,30,40,50}; //通过初始化赋值,给数组限定了,可以存储5个int类型的数据
printf("sizeof(arry2)=%lu\n",sizeof(arry2));//20
int arry3[]; //绝对不允许!!!
数组的初始化赋值:
int arry[5] ={10,20}; // 10 20 0 0 0
int arry[5] ={0}; // 0 0 0 0 0
int arry[5] ={[2]=5,[3]=4};// 0 0 5 4 0
4.非法下标
- 数组中使用的所有的下标都需要在 0~容量-1之内,否则就是非法下表
- 所以后续如果遇到负数下标,一定非法!
- 如果遇到正数下标,需要考虑是否在容量之内。如果不是,那么非法
5.for循环和数组
for循环与数组天生契合,因为for循环有循环初始化,循环终止条件,步进语句。数组中有起始下标还有结束下标。
举例:利用for循环对数组进行赋值
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arry[5] = {0};
int capacity = sizeof(arry) / sizeof(arry[0]);
for (int i = 0; i < capacity; i++)
{
printf("请输入第%d个元素\n ", i);
scanf("%d", &arry[i]);
}
for (int i = 0; i < capacity; i++)
{
printf("arr[%d]=%d ", i, arry[i]);
}
printf("\n");
return 0;
}
6.数组作为函数的参数
需求:用户提供一个int类型数组,函数执行完毕后,展示出数组中的每一个元素的值。
需求分析:
- 返回值:函数执行完毕后,展示出数组中的每一个元素的值,所以仅作打印,不需要返回值
- 参数:一个是数组(int类型) 另一个是数组容量(int类型)
- 函数名:show_arry();
函数声明:
void show_arry(int arry[],int capacity);
函数实现:
void show_arry(int arry[], int capacity)
{
for (int i = 0; i < capacity; i++) { printf("arry[%d]=%d ", i, arry[i]);
}
printf("\n"); }
函数调用:
void show_arry(int arry[], int capacity)
{
for (int i = 0; i < capacity; i++)
{
printf("arry[%d]=%d ", i, arry[i]);
}
printf("\n");
}
7.数组中元素的排序算法
案例1:现有数组 arry[5] ={ 3,5,4,1,2},请你编写代码,将此数组中的元素重新排列,按照从小到大的顺序排列
冒泡排序:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arry[5] = {3, 5, 4, 1, 2};
int n = sizeof(arry) / sizeof(arry[0]);
int count=0;
int flag=0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n-i-1 ; j++)
{
if (arry[j] > arry[j + 1])
{
int temp = arry[j];
arry[j] = arry[j + 1];
arry[j + 1] = temp;
flag=1;
}
count++;
}
if (flag==0)
{
break;
}
}
printf("%d\n",count);
for (int i = 0; i < n; i++)
{
printf("%d ",arry[i]);
}
return 0;
}