C语言基础:第8天
内容提要
- 数组的概念
- 一堆数组
数组
数组的概念
什么是数组
数组是相同类型,有序数据的啊集合

数组的特征
-
数组中的数据被称之为数组的元素(数组中的每一个匿名的变量空间),是同构的
- 数组中的元素存放在内存空间建(char player_name[6]:申请在内存中开辟6块连续对的基于char类型的变量空间)
int a,b,c,d;
int a[4];
衍生概念: 下标(索引)
- 下标或者索引代表了数组总元素距离第一个元素的(首地址所在元素)偏移量.举例:第一个元素距离第一个元素的偏移量为0,所以数组的下标从0开始
- 数组中元素的地址值,下标越大,地址值越大
- 数组的下标从0开始
一堆数组
数组的定义
语法:
类型说明符号/数组类型 数组名[数组容量]
说明:
- 数组的类型说明符由数组的元素来决定,类型说明符也就是数据类型,元素是什么类型,数组就是什么类型, 同一个数组中,所有元素的类型都是一致的.
- 数组名也是标识符,我们所说的数组(名), 大家可以理解为数据类型时数组的变量(名),命名规则与变量名相同,遵循标识符命名规则(标识符命名规则:不能以数字开头,只能包含数字.字母.下划线).
- 数组容量也可以叫做常量表达式或者元素个数,其值必须为整型,可以包含常量和符号常量,但不能是变量
int size = 10;
int arr[size]; //这里永远是10,因此此时数组的内存已将申请,此时数组的大小就是10. 并不会因为后面面size的重新赋值而改变
size = 22;
printf(“%d”,size);//22
举例
int size = 10;
int arr[size];// 这里永远是10,因此此时数组的内存已将申请,此时数组的大小就是10,并不会因为后面对
size重新赋值而改变
size = 22;
printf("%d",size);//
类型:
代表了数组中元素的类型
容量:
数组中能存储多少个元素,数组容量可以是一个常量,常量表达式,还可以是符号常量,但必须是整形
深入理解:
-
定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存单元。所申请的内存单
元是连续。
-
定义一个数组,相当于定义了多个匿名的变量,这写变量可以通过
数组名[下标]来访问范例:
//定义一个数组 int arr[10];//此时只是在内存中国申请了10个元素所对应的空间,此时里面的值是随机值 //上面数组中,最小下标是0,最大下标是9
经过案例,得到:
数组的最大下标 = 数组元素个数(数组容量)- 1
数组元素的访问
原则: 数组中的元素不能一次性访问所有, 只能一个一个访问
访问方式:
数组名[下标];
举例:
//定义一个容纳 10 个元素的int数组
int arr[10];
// 给数组的第一个数进行赋值
arr[0] = 89
//访问数组中的第一个元素
int a = arr [0];
int c = arr[9]; //0
int b = arr[10] //报错
注意:数组元素的访问一定不能越界
案例:
- 需求:利用循环结构给数组元素a[0]~a[9]赋值
0~9,并且逆序输出.
代码:
#include <stdio.h>
int main(int argc,char *argv[])
{
//创建一个数组,用来存放0~9的数字
int a[10];
//使用for循环给数组元素赋值(一般数组配套的都是for循环)
//在c语言中,没有提供数组的大小,需要我们自己计算,数组的大小 = 数组总字节数 / 一个元素的字节数
int len = sizeof(a) / sizeof(int); //等价于int len = sizeof(a) / sizeof (a[0])
for(int i = 0; i < len; i++)
{
a[i] = i;
}
//逆序输出
//遍历:通过循环将数组中的元素一个一个取出
for(int j = len - 1;j >= 0;j--)
{
printf("%4d",a[j]);
}
printf("\n");
return 0;
}
#### 数组初始化
定义数组的同时,用指定数据来给对应的元素赋值
简化数组定义后,需要对元素一一赋值操作
语法规则:
数据类型 数组名[数组容量] = {常量1,常量2....};
注意事项:
数组可以部分初始化
如果定义数组时为指定数据容量,系统会根据初始化元素的个数来决定数组容量/
int arr[10] ={11.12.13.14.15};
int arr[10] = {11,12,13,14,15,0,0,0,0,...};
int arr[] = {11,12,13,14,15};
柔性数组
柔性数组的概念是c99标准,针对结构体的最后一个成员可以是一个未指定大小的数组
广义理解: 数组容量待定或者待确定的数组,举例:int arr[] = {1,2,3,5}
一维数组的案列
案例:
需求:斐波拉切数列
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;// 循环变量
// 定义一个数组,用来存储数列,默认存储的第1和第2的值是1
int f[20] = {1,1};
// 计算数组的大小
int len = sizeof(f) / sizeof(f[0]);
// 使用for循环,将生成的数据存入数组
for(i = 2;i < len; i++)// i=3
{
f[i] = f[i-2]+f[i-1];// 给数组元素赋值,从数组的第3个元素开始 1,1,2,3,5..
}
// 遍历数组
for(i = 0; i < len; i++)
{
// 遍历的时候,要求每5个换一行,也就是1行显示5个
if(i % 5 == 0)
{
printf("\n");
}
printf("%8d",f[i]);
}
printf("\n");
return 0;
}
数组的典型应用: 冒泡排序
选择排序,插入排序,快速排序,桶排序,堆排序,希尔排序,鸡尾酒排序,冒泡排序,二分查找
向后排序
思想:
1.一次只排好一个数,针对n个数,最差情况需要n-1次
2. 每次排序将相邻数据比较
2. 在余下的数中,再次应用第2步的操作,直到只剩下1个数

代码:
#include <stdio.h>
int main(int argc,char *argv[])
{
// 创建一个数组,用来存储排序的序列
int arr[10];
// 定义三个变量 i:比较的轮数(0~len-1)j:每一轮比较的次数(0~len-1-i)temp:临时变量,用来实
现两个变量值的交换
int i,j,temp;
printf("请输入10个整数:\n");
// 计算数组的大小
int len = sizeof(arr) / sizeof(arr[0]);
// 通过循环录入数据
for(i = 0; i < len; i++)
{
scanf("%d",&arr[i]);
}
printf("\n");
// 冒泡排序
// 第一次循环:控制比较的轮数:轮数 = len -1;
for(i = 0; i < len - 1; i++)
{
// 第二层循环:控制每一轮的比较次数:次数 = len - 1 - i
for(j = 0; j < len - 1 - i; j++)
{
// 相邻两个数进行比较,满足条件交换位置
if(arr[j] > arr[j+1]) // 1 2
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
printf("冒泡排序后的数列:\n");
for(i = 0; i < len; i++)
{
printf("%4d",arr[i]);
}
printf("\n");
return 0
二维数组
定义
二维数组本质上是一个行列式的组合,也就是二维数组由行和列两部分组成,属于多维数组,二维数组是通过行列进行解读
二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过他的元素是一维数组
语法
数据类型 数组名[行数][列数]; //二维数组外层表示行数,内层表示列数
举例:
int arr[3][3]= ={{11,22,33},{21,22,23},{31,32,33}};

注意:在C语言中,二维数组在计算机的存储顺序是按行进行的,即第一维的下标变化快,二维快
应用场合:
主要用于数据有行列要求的情况:
特殊写法:
下标可以是整型表达式a[2-1][2*2-1]
下标可以是已经有值的变量或数组元素,如a[2*x-1]
数组元素
初始化


1万+

被折叠的 条评论
为什么被折叠?



