一.数组的概念:
数组是一种容器,可以用来存储同种数据类型的多个值
二.数组的定义
1.格式:
数据类型 数组名[数组长度];
2.特点
①:数组中的空间是连续的
②:数组一旦定义,长度就不再可变
三.数组的初始化
1.初始化的概念:
定义数组的时候,第一次给数组赋值
2.数组初始化的格式:
数据类型 数组名[数组长度] = {数据值1, 数据值2, ..., 数据值n};
// n等同于数组长度,不能多但能少
如果设置的数据值的个数等同于数组的长度,那么在对应的位置上放上的就是对应的数据
但是如果设置的数据值的个数小于数组的长度,那么前n个位置上放上的就是对应的数据,后面的数据都是被设置的默认值(比如整形int的默认值为0,小数的默认值为0.0)
四.访问数组
在我们访问数组的元素之前,我们需要了解什么是“索引”
1.索引
(1).索引的概念:
索引就是数组的一个编号,也叫做角标,下标,编号
(2).索引的特点:
①:从0开始计算
②:连续加一
③:不间断(因为数组分配的空间就是不间断的)
2.获取数组中的元素
使用的格式为:
数组名[索引];
这时我们获取到的就是我们想要的索引的数据了
但是我们需要注意的是:索引是从0开始的,也就是说第一个元素的索引是0,如果有n个元素,那么最后一个元素的索引就是n-1
(1).获取数组中的元素
#include<stdio.h>
int main() {
int nums[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < sizeof(nums) / 4; i++) {
if (i % 2 == 0)
printf("%d\n", nums[i]);
}
}
(2).修改数组中的元素
#include<stdio.h>
int main() {
int nums[5] = {1, 2, 3, 4, 5};
// 把数组中的最后一个元素从5修改为了10
nums[4] = 10;
}
五.数组遍历
1.遍历的概念:
依次获取数组中的每一个元素
2.使用循环对数组进行遍历:
#include<stdio.h>
int main() {
int nums[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < sizeof(nums) / 4; i++) {
printf("%d\n", nums[i]);
}
}
六.内存中的数组,变量
1.内存的概念:
软件在运行时用来临时存储数据的一片空间
2.内存地址的概念:
操作系统为了更好的管理内存,因此把内存中的空间划分为一个又一个的字节(每个字节都有自己独立的编号,而这个编号就是内存的地址)
内存地址在书写的时候会被转成十六进制
3.内存地址的作用:
快速地管理内存空间
4.内存地址的规则:
①:在32位的操作系统中,内存地址以32位的二进制表示
②:在64位的操作系统中,内存地址以64位的二进制表示
注意:如何计算数组的长度?
公式:数组的总长度 / 数据类型占用的字节个数
因为在我们使用sizeof方法获取数组的总长度时,获取到的是以字节个数显示的数组总长度,所以还要除以该数据类型占用的字节个数才是我们想要的个数
七.数组的常见问题
1.数组作为函数的形参
注意点:
①:实际上传递的是数组的首地址,如果要在函数中对数组进行遍历的话,一定要把数组的长度一起传递过去
②:定义处:arr表示的就是完整的数组
③:函数中的arr只是一个变量,用来记录数组的首地址
#include<stdio.h>
void printArr(int arr[], int len);
int main() {
int arr[] = {1, 2, 3, 4, 5};
int len = sizeof(arr) / sizeof(arr[0]);
printArr(arr, len);
}
void printArr(int arr[], int len) {
for (int i = 0; i < len; i++) {
printf("%d\n", arr[i]);
}
}
2.数组的索引越界
在了解索引越界这个概念之前我们需要重新复习一下:
数组中的最小索引为0,最大索引为数组长度 - 1
索引越界就是我们输入的索引超出了0到数组长度 - 1这个范围,此时编译器就会报错