# 数组简介
什么是数组呢?数字就是一组相同类型元素的集合,是按顺序存储的一系列类型的相同的值。比如说我们要创建一个含有10个int类型的值的数组arr1(数组名)、创建一个含有10个char类型的数组arr2。
注意:数组元素的编号是从0开始的,也就是说,这里的数组arr1的编号是0、1、2、3、4、5、6、7、8、9。一共有10个元素,数组arr2也同样如此。数组arr1的第一个元素是arr1[0],第二个元素是arr1[1],依此类推,直到最后一个元素(也就是第10个元素)arr1[9]。
如果我要给数组arr1中第五个元素赋值为8并将其打印,我们可以这样:
实际上,使用数组元素和使用同类型的变量一样,可以把某个值读入到某个元素中去。例如:
在前面,我们声明了数组arr1是一个可以储存10个元素,每个元素可以储存int类型的值,但这里要注意一个潜在的陷阱:考略到影响程序执行的速度,C编译器不会数组的下标是否正确。下面的代码都不是正确的:
该数组元素(arr1[10]=1和arr1[20]=2)其实是不存在的。
编译器不会查找这样的错误,当程序执行时,这样会导致数据放置在已被其他数据占据的地方,可能会破环程序的结果甚至导致程序异常中断。
当然,我们在创建数组时,数组的类型可以是任意类型:
现在我们把某字符串存储在char类型的数组中(一般而言,char类型数组都存储着char类型元素的值)。如果char类型的数组末尾包含一个表示字符串末尾结束的空字符\0,那么该数组的内容就可以构成一个字符串。如下:
# 一维数组的创建和初始化
数组的创建
前面讲到,数组是一组具有相同类型元素的集合,数组是这样创建的:
type_t arr_name [const_n];
//type_t是数组的元素类型 。
//arr_name是数组名。
//const_n是一个常量表达式,用来指定数组的大小,用来指定数组中有多少个元素。
那我们能不能这样创建数组:
故当我们指定数组大小时,必须用常量表达式。
注意:数组创建,[]中要给一个常量才可以,不能使用变量。
一维数组的初始化
一维数组的初始化就是在数组创建的时候给数组的内容一些合理初始值(初始化)。如下:
不完全初始化时,其余元素默认为0。
下面来看其他数组的创建:
注意这里的arr2数组中包括前两个元素'a' 'b',后面三个元素均默认为0。
对于arr3数组,由于'\0'是字符串结束标志,所以第三个元素'\0'是我们自己放到数组arr3中去的,在这里只有后两个元素是被默认初始化为0的。
这两种写法得到的效果虽然是一样的看,但是方式是截然不同的。
这里我们在数组arr4中存放98可不可以呢,答案是肯定的,因为字符'b'对应的ASCII码值是98,所以就将98解析成字符'b'了。
我们在初始化时也可以不指定数组的大小,请看下面代码:
注意不要忘记最后一个元素'\0'。
总结:数组在创建时如果不指定数组的大小就得初始化,数组元素的个数会根据初始化的内容来确定。对于下面代码是需要我们格外注意区分其在内存中是如何存储的。
接下来,在讲解一维数组的使用之前,我们需要对sizeof()和strlen()进行简单的介绍,我们还是通过代码来介绍,下面请看:
看一下sizeof()和strlen()的区别:
1.sizeof和strlen没有什么关联
2.strlen是求字符串的长度的,只能针对字符串求长度--'\0'之前的字符个数--strlen是库函数--使用需要引用头文件
即#include<string.h>
3.sizeof计算的是变量,数组,类型的大小--单位是字节--是一个操作符
再来看一个例子:
## 一维数组的使用
对于数组的使用我们需要用到一个操作符:[],叫做下标引用操作符,它就是用来访问数组的操作符,下面看代码:
下面我们把数组arr中的abcdef都打印出来,请看:
我们也可以这样:
读者在编译代码是可能会出现警告:有符号/无符号不匹配,这是因为strlen函数默认返回的是一个无符号数,我们只需要进行强制类型转换,即:
我们通常是这样写的:
下面我们来展示一下整型数组:
总结:1.数组是通过下标来访问的,下标是从0开始。
2.数组的大小可以通过计算得到。
int arr[10];
int sz=sizeof(arr)/sizeof(arr[0]);
## 一维数组在内存中的存储
前面我们已经介绍了一维数组的创建和使用,那一维数组在内存中是怎样布局的呢?是怎样存储的呢?我们接着往下看 :
这里有一个整型数组,即int arr[]={1,2,3,4,5,6,7,8,9,10}; 现在我们来打印出其每个元素的地址:
这里先说一下右边的数字是16进制数字
仔细观察我们可以发现每个元素之间都是相差4,原因很简单,因为每个元素都是整型,即每个元素都是4个字节,简单分析一下发现数组在内存中是连续存放的。其实,这里确实是在内存中连续开辟了一块空间,这块空间中就放着我们1到10这10个元素。
下面这副图一定要仔细揣摩一下,对理解数组的存储很有帮助(画图技术不是很好,大家凑合看哈^_^)
一维数组就暂时讲解到这里,接下来看二维数组。
# 二维数组的创建和初始化及其存储方式
对于二维数组的创建和初始化与一维数组并没有很大差别,只是形式上的差别。
二维数组的创建:
int arr1[3][2]; 三行二列
char arr2[3][4]; 三行四列
double arr3[2][4]; 二行四列
对于int arr[3][4]:
即:
在这里,有三行四列的整型元素,我们完全可以将其理解为有三行一维数组。
二维数组的初始化:
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,3},{4,6}};
int arr[ ][4] = {{2,3},{4,5}};
来看一个二维数组不完全初始化的例子:
在前面二维数组的创建中,我们说到数组arr[3][4];将其理解为有三行一维数组,每一行都有四个元素。下面来看例子:
上面的arr数组依然是不完全初始化,其余元素自动补0即可。
注意:在二维数组初始化时,行可以省略,列不可以省略。请看:
接下来看二维数组的使用。
## 二维数组的使用及存储方式
二维数组的使用也是通过下标的方式,二维数组是多行多列的,当我们要访问其中的一个元素是,我们当然要指明这个元素是第几行第几列,这里有个数组:arr[3][4] = {{1,2,3},{3,5,6}};
如果我们要将其所有的元素打印,请看代码:
那如果我们想打印每个元素的地址呢,我们可以这样:
刚才我们认为二维数组用上面这种方式存储的,实际上并不是,请看下面的图片 :
上面这种才是二维数组在内存中存放的方式。
总之,无论是一维数组,还是二维数组,其在内存中都是连续存储的。
以上就是本文的全部内容,主要讲解了一二维数组的创建、初始化、使用以及其在内存中的存储方式。最终目的是让读者初步认识数组,了解数组。