学习记录:第一周day05笔记

发布时间 2023-03-22 21:10:40作者: 菊里菊气

一、数组

什么是数组:变量的组合,是一种批量定义相同类型变量的方式

定义: 类型名 数组名[数量];

int arr[5];

注意:数组的内存空间是连续分配的,且数组的长度一旦确定就无法改变

使用:数组名[下标];

下标:从0开始,范围:0~数量-1

可以是任意整型表达式,包括整型变量和整型常量

遍历:把数组的数据从头到尾显示或访问

一般与for循环配合,把循环变量i当作数组下标

初始化:

类型名 数组名[数量]={1,2,3,4,...};

变体:

1、初始化数据过多,编译器会警告并丢弃多余部分

2、初始化数据不足,编译器会对剩下元素执行值初始化(赋0)

初始化数据可以全部省略,只写大括号{},相当于全部成员初始化为0

类似地{0},{0,0}...都可达到类似效果

3、如果有初始化数据,则可以省略数组数量,因为编译器会自动统计数据个数,从而确定数组的数量

计算数组的总字节数:sizeof(arr);

计算数组成员的字节数:sizeof(arr[0]);

计算数组的长度:sizeod(arr)/sizeif(arr[0]);

数组与变量一样,默认值随机,所以一般要先初始化

数组不能整体初始化,只能逐个初始化,下面的写法是错误的:

int arr[20]=0

这种初始化语法只能在初始化时使用

 

练习1、定义一个长度为10的数组并初始化,计算最大值、最小值、平均值

练习2、定义一个长度为10的数组并初始化,降序排列

 

 

二、数组越界问题

出于程序运行效率考虑,C语言不检查数组下标是都越界

数据越界的后果:

1、一切正常

2、段错误(核心已转储)

3、脏数据

练习3:定义一个长度为10的数组并初始化,找出数组中第二大的值,不能排序

 

 

三、二维数组

一位数组相当于把变量排成一排,通过编号来访问

二维数组相当于把变量排成一个矩阵,通过行号和列号访问

二维数组在内存中依然是连续存储的

定义:

类型名 数组名[行数] [列号]

int arr[4] [5]

[0,0] [0,1] [0,2] [0,3]

[1,0] [1,1] [1,2] [1,3]

使用:数组名[行下标] [列下标];

行下标:0~行数-1

列下表:0~列数-1

遍历:一般需要与双层for循环配合,外层循环遍历行,内存循环遍历列

 int arr[4][5];
 for(int i=0;i<4;i++)
 {
     for(int j=0;j<5;j++)
    {
         
    }
 }

初始化:

数组名[行数] [列号]={{第一行},{第二行},{第三行},...}

变体:

1、大括号内数据可以全部省略,编译器自动执行值初始化(赋0)

2、在大括号数据和列数没有省略情况下,行数可以省略,编译器会自动计算行数

3、不能省略二维数组的列数

4、当列表内元素不够初始化所有数组元素时,被部分初始化的行剩下的元素会被编译器执行值初始化,其余执行默认初始化

 

练习4:定义一个5*5的二维数组并初始化,找出最大值的坐标

练习5:定义一个5*5的二维数组并初始化,计算出最大值的周围一圈的和

 

四、变长数组

定义数组时,使用变量作为数组的长度,这种数组称为变长数组

特点:在代码编译期间数组的长度时不确定的,只有执行到数组的定义语句时,长度才最终确定下来,并且一旦确定也无法改变。

优点:可以根据实际情况来确定数组的长度,从而节约内存

缺点:初始化发生在编译期间,而可变数组长度的确定发生在运行期间,因此可变长数组无法初始化

 

练习6:输入两个正整数m,n(1<=m/n<=6),然后输入数组arr[m] [n]的各个元素的数据,然后计算各个元素之和,统计非零元素的个数、计算平均值、统计大于平均值的元素个数

 

作业1:显示三层杨辉三角

作业2:定义一个长度为N的数组并随意赋值,找出数组中未出现的最小正整数