数组是一类相同类型元素的集合。数组中 各数据的排列(注意是数据的排列而不是数据)是有一定的规律的,下标代表数据在数组中的序号。
在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数即数组长度。
一维数组
一维数组是由数字组成的以单纯的排序结构排列的结构单一的数组。创建一维数组的一般形式为
类型说明符 数组名[常量表达式];//只要是常量表达式就是合法的,但是不能包含变量,如int[n]是不对的
例如 int a[10];
定义一个一维数组,也就意味着在内存中划出一段空间来存放10个整型元素,如图所示:
当我们想要引用数组中某个元素时就可以通过数组名[下标]
的形式进行引用,但是注意,数组下标是从0开始的
int a[10] = {1,2,3,4,5,6,7,8,9,10};
下标依次为 0 1 2 3 4 5 6 7 8 9
在屏幕上打印出数组的第一个元素:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d",arr[0]);
return 0;
}
顺理在屏幕上输出下标为0的元素
一维数组初始化
初始化数组就是在创建数组的同时给数组内容赋一些合理的初始值
eg:
//可以在定义数组时对全部元素赋初值
int a1[10] = {1,2,3,4,5,6,7,8,9,10};
char a2[3] = {'a','b','c'};
//也可以只给一部分元素赋初值
int a3[10] = {1,2,3};
//当数组元素个数已经确定时,我们也可以不指定数组长度
int a4[] = {1,2,3,4,5,6,7,8}
❗我们在定义 数值型数组 时数组长度已经指定但未初始化或没有初始化完全时,凡是没有被初始化的元素,系统会将他们自动初始化为0,如果是指针数组,则初始化为NULL即空指针;如果是字符型数组那就初始化为’\0’。
一维数组在内存中的存储
想要研究清楚数组在内存中是如何存储的,那我们需要知道数组中各个元素的地址,看他们之间有什么联系
#include <stdio.h>
int main()
{
int arr[10] = {0};
int i = 0;
for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i)//这里的sizeof(arr)/sizeof(arr[0]是为了算出数组中一共有多少元素
{
printf("&arr[%d] = %p\n", i, &arr[i]);//按顺序打印数组中每个元素的地址
}
return 0;
}
得出结果
由此我们可以看出一维数组在内存中是连续存放的
二维数组
二维数组其实本质上就是以数组作为数组元素的数组,即数组的数组.
定义一个二维数组与一维数组相似
类型说明符 数组名[常量表达式][常量表达式]
例如 int a[3][3];
//以上定义了一个int型的二维数组,第一行有3个元素,第二行有3个元素
二维数组其实可以看做一种特殊的一维数组,
例如我们可以把a看成一个一维数组,他有三个元素,而每个一维数组包含3个元素
二维数组的初始化
以下是对二维数组初始化的几种方式
//分行给二维数组赋初值
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
//将所有元素写在一个括号内
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
//也可只对部分元素初始化
int arr[3][3] = {{1},{2},{3}};
注意我们在初始化二维数组时,只能省略第一维的长度,不可以省略第二维的长度
二维数组在内存中的存储
我们知道了一维数组是如何在内存中存放的,接下来我们来探究一下二维数组在内存中的
我们打印二维数组中各元素的地址
#include <stdio.h>
int main()
{
int arr[3][4];
int i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
}
}
return 0;
}
结果显而易见
从这段代码的结果不难看出,二维数组中元素排列也是按顺序排放在一起的,及在内存中先存放第一行的元素,接着再存放第三行的元素。。。