C语言--数组

一、一维数组的创建和初始化

1、数组的创建

🎈数组是一组相同类型元素的集合。
🎈数组的创建方式
在这里插入图片描述
🎈数组创建的实例
在这里插入图片描述
注意:数组创建,在C99标准之前,[]中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

2、数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)
在这里插入图片描述

3、一堆数组的使用

对于数组的使用我们之前介绍了一个操作符:[],下标引用操作符。它其实就是数组访问的操作符。
在这里插入图片描述
☃️总结:

  1. 数组是使用下标来访问的,下标是从0开始。

  2. 数组的大小可以通过计算得到。
    在这里插入图片描述

  3. (访问数组时)数组下标可以是变量。

4、一堆数组在内存中的储存

结论:随着数组下标的增大,元素的地址也是连续递增的,由此,我们得出结论为数组在内存中是连续存放的。(类型不一样相差的大小就不一样,比如整型为4字节,字符型为1字节等)在这里插入图片描述
扩展:
🎈局部一维数组没有初始化,系统会给定一个随机值。
🎈全局一维数组没有初始化,系统默认为0
在这里插入图片描述
在这里插入图片描述

二、二维数组的创建和初始化

1、二维数组的创建

在这里插入图片描述

2、二维数组的初始化

在这里插入图片描述

3、二维数组的使用

像一维数组一样就行。需要注意是,可以把二维数组看做多个一维数组,比如二维数组有x行y列,那么就可以看作有x个一维数组,每个一维数组有y个元素。

4、二维数组在内存中的存储

由下图我们可知,虽然我们称二维数组是几行几列,但其实他们和一维数组一样也是连续储存的。
在这里插入图片描述
理解图
在这里插入图片描述

三、数组的越界

🎈数组的下标是有范围限制的。
🎈数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1.
🎈所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

🎈C语言本身是不做数组下标的越界检查,编译器也不一定会报错,但是编译器不报错,并不意味着程序是正确的,所以我们在写代码时,最好自己做越界检查。

四、数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传给函数,数组作为参数传给函数,我们传送的数组名实际是函数首元素地址,然后编译器会根据函数首元素地址去找整个函数(数组的储存是连续的,所以只需要首元素就能用整个数组),然后数组的改变,其实是数组这个地址内部的值改变了,所以不需要返回值,在函数里改变的数组值,实际在外边也已经改变了。

五、数组名是什么?

☃️数组名是首元素的地址。
补充:

  1. 🎷sizeof(数组名),计算整个数组的大小,即sizeof内部单独放一个数组名,数组名表示整个数组。
    在这里插入图片描述

  2. 🎷&数组名,取出的是数组的地址。即&数组名,数组名表示整个数组。比如:在这里插入图片描述看到这,你可能还不太明白,那么就看下解释:第一个打印和第二个打印虽然看着都是首元素的地址,但其实第二个是整个数组的地址,原因就是接下来的第三个和第四个,第三个毫无疑问就是数组第二个元素的地址即arr[1],但第四个打印出来的地址是跳过整个数组后的地址,因为&arr表示整个数组的地址,我们给他+1,那么就是整个数组后的第一个地址,因为整个数组的大小为20字节,第三个是首元素地址+1的地址,也就是说是第二个元素的地址,第四个是整个数组后的第一个元素,所以他们相差16个字节,就像编译器打印出来的那样,(在16进制中,他们表示的数据正好相差了16个字节)。

  3. 🎷除此之外,数组名就表示数组首元素地址。

六、补充

☀️只要不是只写数组名,而是写数组的某个元素,那么他就指的是这个元素,只有只写数组名时,才指首元素的地址,当然我们要想到刚才提到的两个特殊情况 &+数组名:指整个数组的地址。sizeof+(数组名)计算出来的是整个数组的字节大小。
☀️&arr+1是指跳过数组后接下来的第一个地址,❌不能写成&(arr+1),这样写在vs编译器也是不能通过的,因为arr是首元素的地址,地址加1还是指地址,所以不写取地址符号他就是一个地址,所以这种写法是错的。
☀️我们如果要计算数组里面的元素有几个,我们会通过sizeof(arr)/sizeof(arr[0])来计算出,但是如果我们需要把数组传参到函数里,我们可能会把这个式子写道函数里,那么就错了,因为数组传参传的只是首元素地址,所以在32位机器上sizeof(arr)是4字节,在64位机器上是8字节,这个时候我们就得不到数组元素个数了,所以我们用这个式子是在本来的函数里,而不是数组传参后再用,我们可以把在原函数里计算出的值当作参数传给要用到的函数里直接使用。
☀️全局变量和全局数组一样,不初始化默认为0,但是局部里他们就会是一个随机值。
☀️二维数组赋值时,我们既可以按顺序依次赋值(不用大括号),也可以用大括号来赋值(每个大括号表示一行数组,如果赋值数量不足一行的数组元素个数,那么少的就自动赋值为0)。当我们用大括号赋值时,如果我们写出了大括号,那么里面就要有初始化的值,不能只写一个大括号,然后直接写另一个大括号初始化下一行的数组元素。(这样写vs编译器不能通过,会显示语法错误)
☀️函数定义了返回类型,就必须给一个返回值,否则会接收一个随机值。

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值