C语言——数组

大家好我是小锋,今天来给大家讲解一下数组。

一维数组的创建和初始化

数组的创建

数组是一组相同类型元素的集合。
数组的创建方式:
数组创建,在 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])

以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值