【初识C语言之数组】


前言

在生活中我们在记录一些数据数时,有时需要记录的数据是比较多的;比如统计一个班里学生的成绩、又或者是记录顾客的电话号码等等。我们知道C语言中是通过创建变量来储存数据的。但是一个变量只能存一个数据,那当需要存50个学生的成绩就得要创建50个变量了;这也有点太麻烦了,那么有没有其他办法呢?我们观察这些数据会发现这些数据都能归类到某一个相同的类型里面;正是这个特点,C语言中提供了数组来帮助我们存储这些数据。


一、数组的概念

数组是⼀组相同类型元素的集合;数组的元素个数不能为0,最少都需要存放1个元素;并且这些元素的类型必须是相同的。数组分为⼀维数组和多维数组,二维数组及以上称为多维数组;其中一维数组和二维数组比较常用。


二、一维数组

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

  • 一维数组创建的基本语法:
type arr_name[常量值]

type为数组中存放的数据类型,可以是char、int、float、double等等,还可以是自定义的类型。arr_name为数组的名字,由自己命名,建议命名要有意义,不要让别人琢磨不透或者加上相应的注释。[ ]中的常量值用来指定数组的大小及数组最多容纳的元素个数,元素个数不能超过指定的值。
例如:需要储存十个人的年龄,年龄都是整数,就可以创建一个可以存放10个元素的整形类型的数组:

int age[10];

需要存放26个字母,字母都是字符型的,就可以这样创建:

char letter[26];
  • 数组的初始化

初始化就是在创建的时候同时给它们一些值;数组的初始化需要使用到({})英文的大括号。数组的初始化分为完全初始化和不完全初始化;完全初始化的数组[ ]方括号内的值可以不写,编译器会自动识别完全初始化的数组的长度。下面我们通过一些例子来看看。
例如创建一个可以储存5个元素的整形类型数组,并给这个数组完全初始化:

int arr[5] = { 1,2,3,4,5 };//完全初始化

通过调试里的监视可以查看这些值是不是成功放到数组里面了:
在这里插入图片描述
再来看看不完全初始化:

int arr[6] = { 1,2,3 };//不完全初始化

同样通过监视来查看这个数组
在这里插入图片描述
可以发现我们初始化的三个值放在了数组的前面三个,数组没有初始化的部分编译器默认会给初始化为0。在初始化的时候需要注意要初始化的项数不能超过我们给定数组可以容纳元素的个数

  • 数组的类型
    数组也是有类型的,数组算是⼀种⾃定义类型,去掉数组名留下的就是数组的类型
int age[10];//类型为:int [10]
char letter[26];//类型为:char [26]

2.一维数组的使用

  • 数组的下标

在使用之前需要先来了解数组的下标,C语言里规定数组的下标从0开始;假如一个整形数组可以存放n个数,由于下标是从0开始排序的,所以最后一个元素n的下标应该是n-1
在这里插入图片描述C语言里还提供了一个操作符用于数组的访问,就是下标引用操作符[ ](英文的中括号);利用这个操作符配合上数组的下标就能实现对数组里元素的访问!下面我们来看看怎么使用。
例如创建一个储存10个数的数组,并且初始化1~10。

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

要查看这个数组的第五个元素要怎么办呢?只需要数组名和下标引用操作符和需要访问元素的下标;就能轻松访问到该元素了。格式为:

数组名[需要访问元素的下标]
//在int arr[10] = { 1,2,3,4,5,6,7,8,9,10};数组中;访问第5个元素,第5个元素下标为4,书写格式为:
arr[4]

来看看这样能否成功访问呢?
在这里插入图片描述
可以看到是没问题的。

  • 数组元素的打印与输入

如果需要访问数组的全部元素该怎么办呢?这里就可以用到C语言中的循环了;数组的下标都是数字,我们利用循环来生成这些数字,这样就可以成功访问数组里的所有元素了。下面来看一个例子。
同样还是这个数组,这次来访问它里面的所有元素:
在这里插入图片描述
可以看到同样也没有问题。这里大家需要注意,不要越界访问数组。什么是越界访问呢?就是访问的元素个数超过了数组里的元素个数;那越界访问会出现什么样的情况呢?我们来看看:
把循环的判断条件改为15,这样就会产生0~14这些数了,而数组只有10个元素,就造成了越界访问:
在这里插入图片描述
可以发现在越界访问时编译器会报出警告;为什么越界访问之后会打印出来一些这样的数据呢?原因是创建数组的时候其实是向内存申请了一块空间,这块空间里面存储了数组里面的元素,越界访问就是访问到了申请空间之外的内容了,这些内容是什么就无从知道了。(这里-858993460并不是表示这里就是存了这个数,而是指定了用%d的形式把它打印出来了)

在了解了数组的访问方式之后,想要将元素存入数组里就是一样的了。我们在存有1~10的数组内重新存入10到20的数:
在这里插入图片描述
上面提到过,创建数组其实是向内存申请了一块空间,那么数组内部的元素在这片空间内又是怎么来存储的呢?我们可以使用%p这个占位符来把每个元素在内存里的地址打印出来看看:
在这里插入图片描述
来看看这些地址,会发现它们之间都是相差4(这些地址都是以十六进制数打印出来的)。而这个数组里存放的都是整形的元素,一个整形元素的大小又是4个字节。便能推断出这些元素在数组内是连续存放的。

  • sizeof计算数组元素个数

C语言中有这么一个关键字(sizeof),它可以计算类型或者变量的⼤⼩,其实它还能用来计算数组的大小,得到值的单位是:字节(byte)。并且sizeof又能计算出数组内单个元素的大小,并且数组内的元素又是连续存放的,我们先利用sizeof计算出数组的大小;然后除上数组里单个元素的大小,这样得到的不就是数组元素的个数了吗。
来看看可不可行:
在这里插入图片描述
可以发现没有问题。在知道这个之后,在有需要用到数组元素个数的地方就可以采用这种方法,即使对数组的大小做出调整,这种方法同样有效。


三、二维数组

那什么又是二维数组呢?可以这样来理解,把一维数组当成二维数组的元素来看,得到的就是二维数组。把单个元素想象成一个点,一个个的点可以构成一条线段,这个线段就是一维数组;而一条条线段又可以构成一个平面;这个平面就是二维数组。
在这里插入图片描述

1.二维数组的创建和

  • 二维数组创建的基本语法:
type arr_name[常量值1][常量值2];

这里的type同样也是数组内需要存放的元素的类型,arr_name也是数组名;只要命名的有意义即可,常量值1可以理解成二维数组中包含的一维数组的个数;常量值2可以理解成单个一维数组内包含的元素个数。还可以把常量值1和常量值2分别理解成一个面的行和列。
举两个例子来看看:

char ch[5][4];//表示这个ch数组每行有4个元素,一共有5行
int arr[3][5];//表示这个arr数组每行有5个元素,一共有3行
  • 二维数组的初始化

二维数组的初始化就相当于是把二维数组里的一维数组初始化,也分完全初始化和不完全初始化;同样也需要用到{}来初始化。

  • 不完全初始化:
int arr[3][5] = {1, 2, 3};
int arr[3][5] = {0};

//对行分别初始化
int arr[3][5] = {{1, 2}, {3, 4}, {5, 6}};
  • 完全初始化:
int arr[3][5] = {1, 2, 34, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7};

在初始化的时候二维数组的“行”可以省略不写,但是必须指明每行有多少个元素。即可以省略“行”,不能省略“列”。

2.二维数组的使用

C语言中,二维数组中元素的访问同样也是通过下标来访问的;在访问时需要同时使用“行”和“列”来对需要访问的元素进行锁定。那么二维数组的下标又是怎么来排序的呢?C语言里规定,⼆维数组的⾏是从0开始的,列也是从0开始的
拿这个二维数组来看:

int arr[3][5] = {1, 2, 34, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7};

在这里插入图片描述
假如需要查看第一行第的第三列的元素,通过行和列就能快速定位到这个元素是5。书写格式为:arr[1][3]

  • 二维数组的输出和输入

访问二维数组内所有的元素,需要同时用到“行”和“列”的组合就能得到所有元素的下标,从而访问到所有元素,用上面的二维数组为例,我们给这个数组中重新放入一些数据。
在这里插入图片描述

并且二维数组在内存中同样是连续存储的。我们同样可以使用sizeof来求的数组的“行”和“列”;求行数只需用整个数组的大小除上单行的大小,求列数只需使用单行的大小除上单个元素的大小。
在这里插入图片描述


四、C99中的变长数组

在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式。这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组⼜⼩了不够⽤,后来在c99的语法规定里新增了变长数组;(variable-lengtharray)简称VLA,允许我们使⽤变量指定数组⼤⼩。
通过一些例子来看看;我们指定一个长度为5的数组:
在这里插入图片描述

再指定一个长度为10的数组:
在这里插入图片描述
可以发现都能满足我们的需求,正是变长数组的加入;让我们在对数组的创建上变得更加灵活。上面使用的是gcc编译器,由于vs2022支持的c99语法中还未包含变长数组,所以在vs中还不能使用变长数组。


结语

到这里今天的内容就分享完了,感谢大家的阅读!如有讲的不对的地方还请麻烦指出,再次感谢大家的阅读。拜拜!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值