各位看官好。这是鄙人发布的第四篇博客。今天我们讲的是c语言里面的数组。这是鄙人在上一篇博客里面有提及过的,今天我们就认真的来讲解一下,c语言里面的数组的创建与使用吧!
一.一维数组
1.1:一维数组的创建与初始化
1.1.1:一维数组的创建
一维数组又称为数组,因为取一维数组这个名字我认为是为了与二维数组区分开来。当然还有多维数组,但是二维数组在还是小白的我来说是已经够的了。好了,接下来就是的含义。数组: 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。就是相当于将一大堆有共同特点的人聚集在一起。
以上就是一些基本的数组创建,当然其他类型的数组创建也是相同的。上面第二个,是因为没有写数组的大小,系统会自动依据,数组内容来创建数组大小,但缺点是,创建出来的数组,大小刚刚好,不会多也不会少,这样的话,如果需要对数组内容进行改变的话,可能会出现bug!
还有一个创建数组的很重要的就是,[ ]里面必须是一个常量,不能是变量,并且数组内容不能像下面这样。或者可以使用宏定义进行数组大小的确定。
这就是数组创建的正确方法。
1.1.2:一维数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理初始值(初始化),这如同变量的初始化一样,对数组里面的元素进行确人到底是什么。
上面就是创建了一个int类型的数组并且数组大小为3,元素分别为1,2,3。而且大家一个也看见了,在右边有[ ]括起来的三个数字,分别为0,1,2.这就是在开头写的,下标。就是相当于你创建的数组,有几个元素,每一个元素都有一个下标,从0开始依次向后加一。所以上面有三个元素,1,2,3。下标0对应的元素为1,下标1对应的就是2.以此类推,就是下标的大概意思。
这是当数组大小与数值个数不一样,且小于数值个数的时候。int类型会自动将剩下的空间装换为0。
这是当不指定数组大小时,系统自动确定的数组大小,与数组大小和元素个数大小相同是一样的。
这是字符串数组存储字符串,且不确定数组大小的。注:注意数组大小和最后一项的区别
这是当字符串数组大小与元素大小相等的情况,但是这样是错误的。这个与上面不确定数组大小的相比,最后一项没有\0。因为没有\0所以无法确定字符串的长度,int类型创建会自动加一个\0的。但是字符串数组必须自己预留出一个元素空间来给\0,那不然这个数组运用的话是会崩溃的。
这是当数组大小大于字符串中的字符数的时候,系统会自动用\0代替。所以这也是需要在使用字符串数组需要预留一个字符串空间的原因。
1.2:一维数组的使用
一维数组的使用会引用到,我在上面所说过的,下标。
这就是使用arr1数组且利用下标打印出了arr1数组里面下标为3的字符d。因为下标是从0开始依次向后累加的,所以下标3对应的字符为d。
这是结果:
sizeof()操作符用于取长度,以字节为单位。sizeof(数组名)即求的时整个数组的大小。sizeof(首元素)即求数组单个元素大小。用0下标,是因为数组至少存在一个有效元素,所以0下标永远存在。
数组是使用下标来访问的,下标是从0开始。
数组的大小可以通过计算得到。建议采用sizeof(arr)/sizeof(arr[0])这种方式。
注:数组在内存中开辟是线性连续且递增的。在c语言中,任何变量(基本变量,指针变量,结构体变量,数组变量)的空间都是整体开辟,但任何元素的起始地址一定是开辟字节当中最小的。
二:二维数组
2.1:二维数组的创建与初始化
2.1.1:二维数组的创建
其实二维数组的创建与一维数组的创建有异曲同工之妙,都是数据类型+数据名+[ ]
二维数组创建时,行数可以忽略不写。并且所有维度的数组其第一个方括号的内容可忽略。上面有一个缺点是,数组名不能重复,这里只是方便观看。
上面就是使用宏定义和行数忽略没有写的情况。但大家可以很清楚的看到,第2行,没有写行数的情况下,把内容确定了,而第一行把行数省略了,没有对内容确定,使用身体在数组名下面画出了波浪线,提醒我们有问题。
2.1.2:二维数组的初始化
二维数组的初始化如同一维数组一样,只是二维数组多了一个列数,大家可以想想看,行和列。几行几列。
可以把二维数组当作座位,只是行和列都是从0开始的,如:
由此可以得出二维数组与数组下标是搭配使用的,从0开始,依次向后累加。所以arr[0][0]打印出来的就是0.
花括号中的一个花括号代表一个一维数组的初始化。当里面无花括号分组时,按照顺序从第一个开始逐个进行初始化。余下的未赋值的元素用0初始化。
2.2:二维数组的使用
二维数组的使用我已经在初始化已经体现过了,普通的使用需要使用双循环来打印,因为二维数组的创建就是有两个序列。当然也需要两个循环来打印,一个大于行,一个大于列,当一行中的每一列打印出来后,第2个循环结束,那么返回到第一个循环,再次进入第二个循环打印第二行的列元素。
三:数组指针与指针数组
3.1:数组指针
数组指针:是指针,指向数组,指针变量既然可以指向变量,同样的,也能指向数组元素,因此,数组元素的指针就是数组元素的地址。例:int (*arr)[10]
由于指针指向的是一个地址,因此数组指针也同样可以进行相关运算;例如指针的加减可以实现指针指向数组上一个或者下一个元素的功能。这边需要说明,数组指针中进行乘法和除法是没有意义的。
3.2:指针数组
上面使我们刚开始举出的例子,这就是一个最简单的指针数组。因此我们可以得出指针数组的定义。指针数组:一个数组的元素均为指针类型数据,称为指针数组。
首先,对于语句int*p[4]
,因为[ ]
的优先级要比*
要高,所以 p 先与[ ]
结合,构成一个数组的定义,数组名为 p,而int*
修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 4 个指向int
类型数据的指针,如图所示,因此,它是一个指针数组。
这就是今天鄙人想与大家分享的数组类容,当然还有很多瑕疵,希望大家可以在评论区指出。