数组的基本知识

1.数组的概念

1.1数组的概念

数组是一组相同数据类型的集合
1.数组元素个数不能为0;可以是一个或者多个。
2.数组中存放的多个数据,类型是相同的。

数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

2.一维数组的创建和初始化

2.1数组创建

type arr_name【常量值】;
举例:int fxk[20];

存放在数组的值被称为数组的元素,数组在创建时可以设置数组的大小和数组元素的类型。

type指定的是数组中存放数据的类型,可以是char,short,int ,float等等,也可以自定义的类型。

arr_name指的是数组的 名字,这个根据实际情况,随便起就行。

【】中的常量值是用来指定数组的大小,数组大小根据实际需求指定就行。

2.2数组的初始化

有时候,数组在创建的时候,我们需要给定一些初始值,这种就称为初始化。
那数组如何初始化呢?其实啊,数组的初始化一般使用大括号,将数据放在大括号中。如下:

int fxk[10]={1,2,3,4,5,6,7,8,9,10};

上面这个数组有10元素,我全给放进去了,这种叫完全初始化。

相对的,也有不完全初始化,如下:

int  dmm[10]={0,1,2,3};

我只放了四个元素,那剩下的就被系统默认初始化为0.

注意,char类型的数组里面可以放字符,也可以放字符串。如下图:

char dmm[3]={'1','2'};
char  fxk[3]={"Ily"};

注意,数组初始化可以少放元素,但是不能多放,如下:

int fxk[3]={1,2,3,4};//这是八对的

此外,当对数组进行初始化时,数组的大小可以省略,编译器会根据数组初始化的内容,自动计算数组的元素个数。

int  fxk[]={1,2,3,5,6,9,10};

2.3数组的类型

**数组也是有类型的,去掉数组名就是数组的类型。**如下:

int fxk[20];
float dmm[10];
char  hxy[5];

fxk数组的类型就是 int [20]
dmm数组的类型就是float [10]
hxy数组的类型就是char[5]。

注意区分fxk[20]数组前的 int 是指数组元素的类型,不是数组的类型,不要弄混。

3.一维数组的使用

一维数组可以存放数据,存放数据的目的是对数据的操作,那么,如何使用一维数组呢?

3.1数组下标

c语言中数组是有下标的,下标从0开始,依次增加。例如:

int fxk[10]={1,2,3,4,5,6,7,8,9,10};

元素1对应的下标为0,元素2对应的下标为1,以此类推。

所以一个数组中如果有f个元素,那最后一个元素的下标就是f-1。

下标就相当于数组元素的编号。

所以我们就可以通过写出数组元素的下标去“代指”元素。

在语言中数组的访问提供了一个操作符【】,这个操作符叫做:下标引用操作符。有了这个操作符,我们就可以轻松代指元素了。
格式为:数组名【下标】
例如:fxk[5]

看不懂的看下图:
在这里插入图片描述
途中fxk[4]代指的就是fxk数组中下标为4的元素,即5。

上图中我们是一个一个打印的,打印一个写一个效率太低,有没有办法一口气全打印出来呢,可以的,借助for循环就可以。如下图:在这里插入图片描述
那我们如何给数组输入值呢?

4.一维数组的存储

&是取地址符号
%p用来打印地址

1.数组在内存中是连续存储的
2.随着下标的增长,地址是由小(低)到大(高)变化的

5.sizeof计算数组元素个数(%zd)

sizeof我们之前已经知道可以用于计算数据类型的 长度,其实它也可以用于计算数组元素的个数。
记得%zd打印。
那是如何计算的呢?如下:

int fxk[5]={0,1,2,3,4};
printf("%zd\n",size(fxk));

是这样吗?(自己敲一遍运行一下),结果你会发现是20,可是该数组元素个数明明是5啊,20是怎么算出来的呢?

答案很简单,该数组中存储了五个int类型的元素,一个int占4个字节,4*5=20,所以,我们只需要再把这个数除以该数组元素类型大小就可以得到元素个数。如下:在这里插入图片描述
逻辑:数组总大小/单个元素大小=元素个数

一张图说明这样做的好处:
在这里插入图片描述

6.二维数组

6.1二维数组的概念

如果把一维数组作为数组的元素,这时候就是二维数组。
在这里插入图片描述
一维数组是整形元素的数组。
二维数组是一维数组的数组。

6.2二维数组的创建

那我们怎么定义二维数组呢?如下:

type arr_name[常量值1]{常量值2};
举例: int fxk[3][4];

解释:3表示数组有三行,4表示每一行有四个元素。
int 表示数组的每个元素是整数类型。
fxk是数组名,可以根据实际需要随便起。

7.二维数组的初始化

在创建变量或者数组的时候,给定一些初始值,被称为初始化。
那二维数组如何初始化呢?像一维数组一样,也是使用大括号初始化的。

7.1不完全初始化

int fxk[3][5]={1,2,3,4,5,6,7,8,9};

这就是不完全初始化,根据上文知识,我i们可以知道fxk数组有3行5列共15个空间,而我们只放入了9个元素,其余空间默认初始化为0,所以称为不完全初始化,看不懂的看下图:在这里插入图片描述

7.2完全初始化

int fxk[3][2]={0,1,2,3,4,5};

在这里插入图片描述
emmm,就是这个样子,应该可以看懂吧。

7.3按照行初始化

int dmm[3][5]={{12}{34}{56}}

在这里插入图片描述

7.4可以省略行不能省略列。

举例:

int fxk[2][3]={1,2};//正常初始化
int fxk[][2]={1,2,3,4,5};//省略了行
int fxk[2][]={1,2,3,4};//省略了列

当我们知道列数,那就知道一行能存几个,存满了就换行,直到数据存储完毕。如下图:

当我们不直到列数,也就不直到一行存几个,不知道什么时候换行,所以列数不能省略。

8.二维数组的使用

8.1二维数组的下标

二维数组的访问也是使用下标的形式的,二维数组是由行和列构成的,因此只要锁定了行和列就能锁定数组中的唯一元素/。

C语言规定,二维数组的行是从0开始的,列也是从0开始的。

话不多说,我们来看下图。
在这里插入图片描述
如果你看不懂,可以试着 先把fxk数组画出来,便于理解。如下:
在这里插入图片描述
这么看是不是一目了然,**红色的代表行数,蓝色的代表列数。**那么我们上面所打印的下标【1】【2】对应的不就是一行二列的元素7嘛!

8.2二维数组的输入和输出

我们前面已经介绍了如何对二维数组单个元素进行访问,那现在我们来写一下如何对整个二维数组进行输入和输出,以下面的fxk数组为例:

int fxk[3][4]={0};

这个数组共有三行,四列,注意:当我们想输入元素到这个数组时,顺序是先从第一行开始,第一行输满了才会到第二行。看不懂的看下面代码:
在这里插入图片描述
细品一下,我们把 列的循环 嵌套在 行 里面,这样就可以达到一行输满再起下一行的效果。

下面是输入+输出的代码:在这里插入图片描述

9.二维数组在内存中的存储

二维数组在内存中也是连续存放的

int fxk[2][3]={123456};

对于上面这个数组,为了便于理解,我们通常会把它在内存中的存储想象成黑色的这个样子,但实际上,在内存中,它是红色的这个样子。

而且二维数组中的每一行都是一个一维数组,所以 **二维数组
+【行数】**就是这一行一维数组的名字。在这里插入图片描述
例如fxk【0】。

10.c99中的变长数组。

在c99标准之前,c语言在创建数组的时候,数组大小的指定只能使用常量,常量表达式,或者我们初始化数组的时候,可以
省略数组大小。
例如:int fxk[10]; int dmm[8-5]; int hxy[]={1,2,3};

这种语法限制,让我们在创建数组不够灵活。
在c99之后,c语言引入了变长数组的概念,使得数组的大小可以使用变量来指定。

变长数组不能初始化

但是vs2022(2019)不支持变长数组.
可以去devC++试试。

11.数组练习

补充:%s打印字符串,%c打印字符,别弄混了。

11.1练习1: 多个字符从两端移动,向中间汇聚。

在这里插入图片描述

11.2 练习2:二分查找

在一个升序的数组中查找特定的数字n,很容易想到的办法就是遍历数组,但是这种办法效率很低。

比如我买了一双鞋,你好奇问我多少钱,我说不超过300元,你怎么猜,用历遍数组的办法就是从1开始,1,2,3一个一个猜,效率真的很低。

二分法:0~300,我们i第一次直接猜150,你反馈大了还是小了,这次我们每一次猜都可以排除一半的数据,效率很高。但是这种办法只能用于有序的数据。(升序或者降序)
参考代码:
在这里插入图片描述

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值