一.数组的概念
数组是一组相同类型元素的集合;
1.数组中存放的是一个或者多个数据,但是数组的元素个数不能为0。
2.数组中存放的多个数据,其类型必须是相同的。
3.数组分为一维数组和多维数组。多维数组一般常见的是二维数组。
二.数组的创建
一维数组创建的基本语法如下:
type arr_name[20];
存放在数组里的值称为数组的元素。
数组在创建的时候可以指定数组的大小和数组元素的类型。
type ----- 指定的是数组中存放的数据的类型,比如int char short float等等,也可以是自定义类型。
arr_name------是数组的名字,根据实际情况起名,使名字有意义即可。
【常量值】------- 这是用来指定数组的大小的,大小根据实际需求指定即可,二维情况特殊,后面介绍。
例:
int arr[20];
这创建了一个元素类型为整形的可以容纳20个数据的数组。
三.数组的初始化
数组在创建的时候,我们给定一些初始值,这就称为初始化。
初始化分为两种。
//完全初始化,可以不写数组大小
int arr1[3] = {1,2,3};
//不完全初始化
int arr2[3] = {1};//第一个元素为1,其余元素默认为0
//错误的初始化
int arr3[3] = {1,2,3,4,5};//元素个数大于数组的大小
四.数组的类型
数组其实也是有类型的,而数组可以算作一种自定义类型,去掉数组名留下的就是数组的类型。
int arr1[10];
char arr2[5];
//arr1的数组类型就是int [10]
//arr2的数组类型就是cahr [5]
五.一维数组的使用
1.数组的下标
C语言规定数组的元素是有下标的,下标是从0开始的,假设数组有n个元素,第一个元素的下标就是0,第二个元素的下标是1,。。。。,最后一个元素的下标是n-1;
如下:
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
//index 分别是 0 1 2 3 4 5 6 7 8 9
2.操作符 [ ]
在C语言中数组的访问提供了一个操作符 [ ],这个操作符叫:下标引用操作符。
比如:当我们们访问下标为7的元素是1我们就可以使用arr[7];
#include<stdio.h>
int main
{
int arr[5] = {1,3,5,7,9};
printf("%d",arr[3]);//5
return 0;
}
3.数组元素的打印
当我们要访问整个数组的时候我们就可以使用循环,
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
输出的结果便是 1 2 3 4 5 6 7 8 9 10
4.数组的输入
明白了数组的访问我们当然也可以给数组输入我们想要的数据,这个可以在初始化的时候进行,也可以利用循环输入
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
5.一维数组和二维数组在内存中的存储
要了解数组在内存中的存储,我们需要打印数组的地址
这时候我们需要用到占位符%p
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
printf("&arr[%d] = %p\n ", i, &arr[i]);
}
return 0;
}
我们可以发现地址是由小到大变化的,并且当我们仔细观察可以发现,每个两个相邻元素之间相差4,为什么呢?
因为一个整形是4个字节。
所以我们可以得出一个结论:数组在内存中是连续存放的。
那二维数组中也是吗???
我们可以试一下
#include <stdio.h>
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9,};
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf(" &arr[%d][%d] = %p ", i,j, &arr[i][j]);
}
printf("\n");
}
return 0;
}
我们可以发现依然是相差4个字节,甚至是在换到下一行的时候,下一行第一个元素和上一行最后一个元素也相差4,所以⼆维数组中的每个元素都是连续存放的
所以我们在二维数组的创建的时候第二个【】中必须写一个常量值,不然就不知道每一列有多少个元素,也就违反了数组在内存中是连续存放的结论
6.数组中元素个数的计算----sizeof
在C语言中有一个关键可以帮我们计算数组元素的个数
就是 sizeof
作用:sizeof关键字提供与变量或类型(包括聚合类型)相关联的存储量(以字节为单位)。此关键字返回size_t类型的值。
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr));
return 0;
}
这里输出的结果是40,单位是字节,为什么是40呢?因为一个整形是4个字节,所以10个就是40个字节,即数组所占内存空间的总大小。
但是这并不是数组元素的个数,那么到底怎么计算呢?
我们知道数组中所有元素的类型都是相同的,那么我们只需要知道数组的所占内存总大小和数组中一个元素的字节,就能算出来了
sizeof(arr)计算的是数组所占内存的总大小,
sizeof(arr[0])计算的是第一个元素所占内存的大小;
所以sz就是数组的元素个数
六.二维数组的使用
1.二维数组的介绍
2.二维数组的创建
type arr[常量值1][常量值2];
比如:
int arr1[3][5];
char arr2[3][5];
这两个数组中的3都表示数组有三行
5都表示数组每一行有五个元素,即五列;
3.二维数组的初始化
初始化分了三种,与一维数组有些不同。
//不完全初始化
int arr1[5][5] = { 1,2,3 };
int arr2[3][3] = { 0 };
//完全初始化
int arr3[3][3] = { 1,2,3 ,4,5,6, 7,8,9 };
//按照行初始化
int arr4[2][3] = { {1,2},{3,4} };
4.行可省,列不省。
int arr[][5] = {1,2,3};
原因在一维数组在内存中的存储已经讲了,这里不再赘述了。
5.二维数组的下标
二维数组访问也是使用下标的形式。
在C语言中,二维数组的行是从0开始的,列也是从0开始。
如下:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
最上面一行的数字表示列号,最左边一列的数字表示行号。并且都是从0开始的
比如第三行第五列,就能快速定位到7;即arr[2][4];
6.二维数组的输入和输出
与一维数组类似,
二维数组的输入输出也可以用循环实现
比如:(有兴趣的可以用以下代码试试)
#include <stdio.h>
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
int i = 0;//遍历⾏
//输⼊
for (i = 0; i < 3; i++) //产⽣⾏号
{
int j = 0;
for (j = 0; j < 5; j++) //产⽣列号
{
scanf("%d", &arr[i][j]); //输⼊数据
}
}
//输出
for (i = 0; i < 3; i++) //产⽣⾏号
{
int j = 0;
for (j = 0; j < 5; j++) //产⽣列号
{
printf("%d ", arr[i][j]); //输出数据
}
printf("\n");
}
return 0;
}
七.变长数组
1 int arr1[10];
2 int arr2[3+5];
3 int arr3[] = {1,2,3};
int n = a+b;
int arr[n];
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
我在gcc编译器上测试,可以看⼀下。(可以自己尝试一下)
以上是对数组的讲解,有什么问题可以私信我或者在评论中发出来,
点个赞,丘丘了