1:数组的概念
概念:数组是一组相同元素的集合。
特点:1、数组中存放的是一个或者多个数据,但是数组的元素个数不可以为0.3
2、数组里存放的数据是同类型的数据
分类:数组分为一维数组和多维数组,其中多维数组一般是二维数组
2:一维数组的定义和初始化
1:定义数组的基本语法为
存放数据的类型 数组名[常量];如创建一个整型数组:int arr[10];arr为数组名,10代表 这个数组的长度。
2:数组的初始化
有时候,数组在创建的时候,我们需要给定⼀些初始值,这种就称为初始化的。
那数组如何初始化呢?数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中。
如下:
3:数组的类型
数组的类型并不是存放的数据的类型,去掉数组名字那就是数组的类型了。如下所示:
int arr[10];
int arr[15];
去掉数组名:那么int [10],int [15],就是数组类型了
3:一维数组的使用
经过上面的学习我们已经掌握了一维数组的创建,下面我们对如何使用一维数组进行 学习。
1:数组下标
数组的每一个元素都是有下标的,下标是从0开始的,最后一个元素的下标为数组长 度-1,比如一个数组的长度为10,那么最后一个元素的下标为9。下面为代码的形式。
2:[ ]操作符
在C语⾔中数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引⽤操作符。 有了下 标访问操作符,我们就可以轻松的访问到数组的元素了,⽐如我们访问下标为9的元 素、我们就 可以使⽤ arr[9] ,想要访问下标是3的元素,就可以使⽤ arr[3]
3:数组的打印
我们可以使用我们前面学过的循环语句,将数组中的每个元素都打印出来即可
由于数组元素的起始下标为0,那么就初始化变量i为0,判断表达式为i<数组长度即可
4:数组的输入
数组的输入和数组的输出类似,使用循环,用i表示数组的下标,然后一个一个输入即 可,判断表达式一样设置为i<数组长度
4:一维数组在内存中的存储
为了更好的了解一维数组,我们可以看看一维数组在内存中是如何存储的,我们可以使用取 地址符号在屏幕上打印出数组每个元素的地址
输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的 元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。
5:sizeof计算数组元素的个数
1:计算一维数组总的大小
在遍历数组中,我们经常需要知道数组的元素个数,在C语言中我们可以使用sizeof关键 字
这里的输出结果为40,计算的是数组所占内存空间的总大小,单位为字节
那么我们需要得到数组的长度,其实就想得到数组中元素的个数,那么使用数组的大小 和数组内一个元素的大小作除法运算就可以得到数组的元素个数和长度了
6:二维数组的创建
前面我们学习了一维数组,数组的元素都是内置类型的,这时候我们如果把一维数组作为数 组的元素,这时候就是二维数组了,同理将二维数组作为数组的元素那么这个数组就是三维 数组了。二维以上的数组就是多维数组了
1:二维数组的创建
基本语法为:存放的数据类型 数组名字[n][m];
其中n、m为常量
实例:int arr[5][5];
解释:其中第一个5表示行数,表示这个数组有五行,第二个5表示每 一 行有5个元素,即表示有5列。int则表示存放的数据类型,arr则为数组名
7:二维数组的初始化
和一维数组一样,在创建数组的时候给定一些初始值,被称为初始化,二维数组和一维数组 一样,使用大括号进行初始化。
不完全初始化:
则在数组中的情况如下图所示:
完全初始化:
其 数组情况如下:
按照行初始化 :
将在大括号里面再使用大括号,里面的大括号就代表每一行,如上面的代码所示:
{1,2}就是第一行,{3,4}就是第二行,{5,6}就是第三行的。
二维数组在初始化的时候,行可以省略,但是列不可以省略
通过上图可以看到,数组会根据初始化时的数据的数量来决定行数。如果初始化的时候不对 列数那就没办法决定一行放多少个元素了。所以在初始化的时候,行可以省略,列不行。
8:二维数组的使用
二维数组的访问和一维数组是一样的也是采用下标的方式,有区别的是,二维数组是由行和 列组成的,所以要锁定了行和列才可以锁定二维数组中的一个元素
和一维数组一样,其行列下标都是从0开始的 如下图所示:
如图中的7的下标就为:arr[2][4];
二维数组的输入和输出:
打印某一个元素我们只要知道他的下标就可以使用printf函数即可,要打印整个数组,如果一 个一个元素这样打印就有点繁琐了,我们可以利用循环来打印,可以发现一个规律,在打印 某一行的时候,其行数是不用发生变化的,只需要对列数进行+1操作即可,然后打印完一行 后,再对行数进行+1操作即可。
9:二维数组在内存中的存储
想了解二维数组在内存中的存储,我们可以和一维数组一样,将其地址打印出来即可
从输出的结果可以看到,同一行相邻的元素,相隔四个字节,跨行之间的元素也是相差四 个字节,所以,可以看出,二维数组中的元素也是连续存放的。
10:C99中变长数组
在前面的学习中可以发现,我们在定义一个数组的时候,对其长度都是时候的常量。这样的 限制,让我们在创建数组的时候不太灵活,有的时候,数组创建小了不够用,数组创建大了 浪费内存。
在C99中给了一个变长数组的新特征,允许我们使用变量指定数组大小。如下代码:
int n=0;
scanf("%d",&n);
int arr[n];
可以实现对数组的长度进行变化,数组的长度可以由使用的场景来决定,大大的提高了数组 的灵活度。
注意:变长数组由于只有运行的时候才确定,所以在创建一个变长数组的时候是不可以初始 化的
不过比较可惜的是不是所有的编译器都支持这个特征,比如我们前面一直时候的VS就不支持 这个特征,在gcc编译器就支持,下面为一些代码展示,可以参考一下:
不过在大部分刷题网站上也是支持的。我们可以在刷题的时候试试。
11:有关数组的练习
练习1:多个字符从两端移动,向中间汇聚
题目解析:1:首先我们应该创建两个数组,一个数组用来存放字符,一个用来接收字 符,从而演示其从两端移动,向中间汇聚,两个数组的长度应该要一样, 且类型应该也要一样。
2:然后就是进行循环将存放字符的数组从两端开始将数据赋值给接收 数组的同个下标的位置。
3:还有就是什么时候停下来了。可以发现当两端的下标碰面后就完成了,那 么我们可以创建两个变量,一个表示左端往后移动的,一个表示从右端往 回移动的。当左端移动的下标大于右端的时候就结束循环。
4:基本逻辑清晰了我们下面就开始操作吧。
为了可以看到其变化的过程,我们可以让每次替换的时候隔一秒打印,我们需要引进一个函数: Sleep()他的参数是一个无符号的整型,单位是毫秒,比如在括号内输入1000就是一千毫秒。
使用这个函数要包含头文件<windows.h>.
练习2:
在一个升序的数组里面找到指定数字n,我们可以使用最容易的方法就是从头往后找,但 是这种方法效率比较低。这个和我们之前写的猜数字游戏有点类似,猜数字游戏是从 1~100内猜,可以把其看成一个升序数组。我们在猜数字的时候肯定也不会说+1+1这样 去猜,这样如果要猜的数字的范围加的话,时间也要加大很多。我们会先去猜范围内中 间的数,如果大了就会把后面的数给排除了,同理,如果猜小了我们就会把前面的数给 排除了。这样效率就高很多了。
题目要求: 创建一个数组,里面有10个元素,分别是1,2,3,4,5,6,7,8,9,10。
用户输入一个值,然后使用二分法在数组中查找有没有这个,如果在就输出找到了, 如果没有就输出找不到。
题目解析:1:我们可以通过两端数组元素的下标来找到中间值,即找平均数,但是在C语言中整 型数据是有范围的,为了防止两端的下标加起来超过了整型数据的最大值,我们 可以使用下面的方法来求平均值
int mid=the_left+(the_right_side-the_left)/2;
2:然后我们就要用中间的值和用户输入的值进行比较,如果中间的值比要找的值 大,那么就让the_right_side=mid-1;反之如果小了就让the_left=mid+1;然后再进 行求平均值,直到找到,或者说the_left>the_right_side的时候就都找过了还没 有,就打印输出没找到。
下面的代码可以参考一下:
标签:二分,初始化,下标,数组,元素,二维,一维 From: https://blog.csdn.net/2302_81083101/article/details/143446612