大家好我是小锋,今天来给大家讲解一下数组。
一维数组的创建和初始化
数组的创建
数组是一组相同类型元素的集合。
数组的创建方式:
数组创建,在
C99
标准之前,
[]
中要给一个
常量表达式
才可以,不能使用变量。在
C99
标准支持了变长数组的概念(在支持从c99的编译器中[]可以放变量)。
数组的初始化
一维数组的使用
对于数组的使用我们之前介绍了一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符。
我们来看代码:
总结:
1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。
一维数组在内存中的存储
下面我们通过一组代码来清晰得为大家展示数组在内存中的存储
仔细观察输出的结果,和内存的存储情况,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:
数组在内存中是连续存放的。
二维数组的创建和初始化
二维数组的创建
二维数组的初始化
二维数组的使用
和一维数组一样用下标操作数组
二维数组我们可以这样看
二维数组在内存中的存储
我们通过代码和内存来理解
通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。
数组越界
数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就 是正确的,
所以程序员写代码时,最好自己做越界的检查。
二维数组的行和列也可能存在越界。
比如:
数组作为函数参数
数组可以作为参数传给函数
数组传参本质是将首元素的地址传过去,在接收时可以用数组形式也可以用指针变量接收
给大家讲一个容易出错的地方
大家想一想这段代码的输出结果是不是arr数组的全部元素?
那这里为什么只有arr[0]的元素?
其实数组再传参是传的是地址所以add在接收是用指针接受的,一个指针是4字节而arr[1]也是4字节
所以在计算数组元素时a=1进而出错。
只需要改进一下就可正确
数组名是什么
先说结论
数组名是数组首元素的地址。(有两个例外)
1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。
我们来验证一下
一维数组:
代表首元素地址的话+1应该跳过一个元素的字节,而代表数组的话+1应该跳过一个数组大小的字节
二维数组:
对于二维数组我们可以将它理解为放一维数组的一维数组
add[0]可以理解为装一维数组的数组的数组下标(二维数组一行的地址)
add[0]又是可以理解为数组中一维数组的数组名
二维数组行列数的计算
列数:一行的大小/一个元素的大小
sizeod(add[1])/sizeof(add[1][2]);
行数:整个数组的大小/一行的大小
sizeof(add)/sizeof(add[1])
以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。