1.基本概念:
数组:是C语言里面一种基本的数据结构,它允许你在一片连续性的空间内存储多个相同数据类型的数据。
- 数组是一种构造数据类型(由多个基本数据类型或者是构造数据类型组成)。
- 数组空间必须连续
- 存储多个数据
- 存储数据类型必须相同
2.数组的定义格式
数据类型 数组名[容量] = {初始化赋值};
分析:
- 数据类型:约束后续数组里面存储数据的数据类型
- 数组名:数组名称,约定俗成,见名知意,动宾结构
- 数组名是一个地址,这个地址是数组中首元素的首地址
- 容量:约束数组中存储相同数据类型数据的个数
- 拓展:后续对数组中元素进行访问,是通过数组名+下标的形式
- 下标:就是数组中第几个元素,下标就为几,数组中元素从0开始,到 容量-1 结束
- 访问: 数组名[下标]
- 数组容量,一旦确定,无法修改
- 数组的空间是连续性的
- 初始化赋值:给数组中每一个元素进行初始化赋值,所以用{ }括起来
#include <stdio.h>
int main(int argc, char const *argv[])
{
/*
数组的类型:int,约束数组中只能存int
数组名:arr,保存的是数组中首元素的首地址
数组容量:10,可以存10个int类型的数据
所以数组下标:0~9
*/
int arr[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
printf("arr[4] = %d\n",arr[4]);
return 0;
}
3.数组相关使用案例
数组打印
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[5] = {10, 20, 30, 40, 50};
printf("arr数组所占字节%lu\n",sizeof(arr));
printf("arr[0] = %d\n",arr[0]);
printf("arr[1] = %d\n",arr[1]);
printf("arr[2] = %d\n",arr[2]);
printf("arr[3] = %d\n",arr[3]);
printf("arr[4] = %d\n",arr[4]);
// printf("arr[5] = %d\n",arr[5]); 野值
char ch[5] = {'h','e','l','l','o'};
printf("ch数组所占字节%lu\n",sizeof(ch));
printf("ch[0] = %c\n",ch[0]);
printf("ch[1] = %c\n",ch[1]);
printf("ch[2] = %c\n",ch[2]);
printf("ch[3] = %c\n",ch[3]);
printf("ch[4] = %c\n",ch[4]);
char str[6] = "hello";
printf("str数组所占字节%lu\n",sizeof(str));
printf("str[0] = %c\n",str[0]);
printf("str[1] = %c\n",str[1]);
printf("str[2] = %c\n",str[2]);
printf("str[3] = %c\n",str[3]);
printf("str[4] = %c\n",str[4]);
printf("str[5] = %c\n",str[5]);
return 0;
}
数组元素长度:
初始化:
初始化相关:
int arr[5] = {0, 0, 0, 0, 0};
int arr2[5] = {0};
int arr3[] = {0, 0, 0, 0, 0};
int arr4[5] = {[2]=3};//将arr4[2] = 3,其余为0
4.for循环与数组
天生一对,因为数组下标从0开始,到capacity-1结束,每两个元素下标差值为1
与for循环的起始、终止、步进语句一一对应。
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int arr[5] = {10, 20, 30, 40, 50};
int capacity = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < capacity; i++)
{
printf("arr[%d] = %d\n",i,arr[i]);
}
}
5.数组作为函数的参数(前瞻)
前言:之前提到过,想通过函数来修改参数的值,需要传地址。数组名,本身是一个地址。
举例:请你封装一个函数,用户提供一个容量为5的数组,函数执行完毕后,数组里面的元素依次被赋值为10,20,30,40,50
分析:
- 返回值:不需要返回值,只需要函数执行完毕后数组里面的每个元素值改变。
- 函数名:SetArr
- 函数参数:
- 数组名:函数需要修改的数组的名字
- 容量:修改的元素个数
- 返回值:无
void SetArr(int arr[],int capacity);
#include <stdio.h>
/**
* 函数功能:对用户提供的数组进行赋值
*
* @param arr[] 数组名,是一个地址
*
* @param capacity 数组容量
*
* @return 无
*/
void SetArr(int arr[], int capacity);
/**
* 函数功能:对用户提供的数组进行展示
*
* @param arr[] 数组名,是一个地址
*
* @param capacity 数组容量
*
* @return 无
*/
void ShowArr(int arr[], int capacity);
int main(int argc, char const *argv[])
{
int arr[5] = {0};
int capacity = sizeof(arr) / sizeof(arr[0]);
SetArr(arr, capacity);
ShowArr(arr, capacity);
return 0;
}
void SetArr(int arr[], int capacity)
{
for (int i = 0; i < capacity; i++)
{
arr[i] = (i + 1) * 10;
}
}
void ShowArr(int arr[], int capacity)
{
for (int i = 0; i < capacity; i++)
{
printf("arr[%d]= %d ", i, arr[i]);
}
printf("\n");
}
6.数组相关的算法(数据的处理)
增 删 改 查(略过)
排序算法:(列举两个)
6.1:冒泡排序:
例如:int arr[5] = {3,5,1,4,2};
#include<stdio.h>
int main(int argc, char const *argv[])
{
int arr[5] = {1,2,3,4,5}; //从小到大排序
int count = 0;
printf("交换前\n");
for (int i = 0; i < 5; i++)
{
printf("%d ",arr[i]);
}
for (int i = 0; i < 5; i++) //外层循环 控制循环次数
{
int flag = 0;
for (int j = 0; j < 5-1-i; j++)
{
if (arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] =arr[j+1];
arr[j+1] = temp;
flag = 1;
}
count++;
}
if (flag == 0)
{
break;
}
}
printf("\n交换后:\n");
for (int i = 0; i < 5; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
printf("count:%d\n",count);
return 0;
}
6.2选择排序
int arr[5] = {3,5,4,1,2},从小到大排
代码案例:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int arr[5] = {3,5,4,1,2};
printf("排序前的数组数据:\n");
for (int i = 0; i < 5; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
for (int i = 0; i < 5; i++) //外层循环 控制第几次遍历
{
int min = i;
for (int j = min+1; j < 5; j++) //找到剩下元素中最小的那一个
{
if (arr[min] > arr[j])
{
min = j;
}
}
if (min!=i) //如果不在应该在的位置,交换过去
{
int temp =arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
printf("排序后的数组数据:\n");
for (int i = 0; i < 5; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}