C语言基础第8天: 数组

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);//

类型:

代表了数组中元素的类型

容量:

​ 数组中能存储多少个元素,数组容量可以是一个常量,常量表达式,还可以是符号常量,但必须是整形

深入理解:

  1. 定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存单元。所申请的内存单

    元是连续。

  2. 定义一个数组,相当于定义了多个匿名的变量,这写变量可以通过数组名[下标]来访问

    范例:

    //定义一个数组
    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]

数组元素

初始化

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值