一、数组的概念
数组是由数据类型相同的一系列函数组成的。其中我们可以得到两条信息:
1、数组中必须有元素,不可能为0个元素个数。
2、数组里的元素必须相同,不可能出现两种不同类型的元素,如不能同时出现int和char。
数组分为⼀维数组和多维数组,多维数组⼀般比较多见的是⼆维数组。
下面我带大家看几个数组的例子:
#include<stdio.h>
int mian()
{
int arr[10]; //含有10个int类型元素的数据
char s[5]; //含有5个char类型元素的数据
double d[20]; //含有20个double类型元素的数据
}
其中方括号([ ])表明arr,s,d都是数组,方括号中的数字表示数组中的元素个数。
二、一维数组的初始化
数组通常是用来储存程序需要的数据。例如,一个含有12个整数元素的数组可以储存12个月份。所以我们就需要一开始就初始化数组为好。
前面我们也介绍了变量的定义,其实数组的初始化与变量的定义十分类似,只是一个是多个,一个是一个。我们可以理解数组为一群元素的集合。
我们来看几个数组初始化的例子:
#include<stdio.h>
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 1,2 };
int arr3[5] = { 1,2,3,4,5,6 };
}
如上所示,用以逗号隔开的值列表(花括号括起来)来初始化数组,各值之间用逗号隔开。这就是数组的初始化,并往下细分为:完全初始化和不完全初始化。
数组arr1叫做完全初始化,即数组的每个元素都赋值,数组arr2叫做不完全初始化,即数组的部分元素赋值。我们在调试的窗口中看到以下内容:
前两个元素正常初始化,后3个元素默认初始化为0。
前面两个是正确的初始化,我们可以发现数组arr3中明明只有5个元素,但我们给他初始化了6个值,这种情况编译器也会给我们报出错误:
正所谓过犹不及,所以以后我们在编程时需要注意不要出现这种错误。
三、数组的类型
数组是有类型的,去掉数组名留下的就是数组的类型。
如下:
#include<stdio.h>
int mian()
{
int arr[10];
char s[5];
double d[20];
}
arr的类型就是int [ ]
s的类型就是char []
d的类型就是double []
四、数组的使用
1、数组下标
我们前面提到,数组是用来储存程序需要的数据。那我们如何获取储存的数据呢?答案就是通过下标。
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
}
在C语言中数组访问提供了一个操作符[ ],这个操作符叫:下标引用操作符。
有了这个操作符我们就个通过操作下标访问数组的元素了,比如我们想访问arr中的元素7,就可以使用arr[6],或者访问arr中的第六个元素,就可以使用arr[6]。注意,虽然这两个值是一样的,但是描述是不一样的,一个是通过元素描述,另一个则是通过下标描述。
下面我们看代码:
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[6]);//7
printf("%d\n", arr[0]);//1
}
输出结果:
2、数组元素的打印
利用我们前面提到的下标加上for循环我们可以打印整个元素的内容。
例如:
#include<stdio.h>
int main()
{
int arr[6] = {1,2,3,4,5,6};
int i = 0;
for (i = 0; i < 6; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
输出结果:
了解了这些信息,我带大家来了解一个新的知识点:指定初始化器。
C99增加了一个新特新:指定初始化器。利用该特性可以初始化指定的数组元素。例如,只初始化数组最后一个元素。对于传统的C初始化语法,要想初始化最后一个元素需要初始化最后一个元素之前的所有元素,但C99规定,可以在初始化列表中使用带方括号的下标指明待初始化的元素,如:
#include<stdio.h>
int main()
{
int arr[6] = { [5] = 6 };
return 0;
}
数组内元素为:
3、数组元素的输入
同打印一样,我们也可以自己初始化数组中的元素。例如:
#include<stdio.h>
int main()
{
int arr[6] = {0};
int i = 0;
for (i = 0; i < 6; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < 6; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
五、sizeof计算数组长度
int main()
{
int arr[6] = { 1,2,3,4,5,6 };
int ret = sizeof(arr);
printf("%d", ret);
return 0;
}
int main()
{
int arr[6] = { 1,2,3,4,5,6 };
int ret = sizeof(arr[0]);
printf("%d", ret);
return 0;
}
结果为:4,说明一个int类型的数组元素在内存中占4个字节,同理一个char类型数组,一个double类型数组分别占1个和8个字节。
之后我们就可以计算出数组的长度:
int main()
{
int arr[6] = { 1,2,3,4,5,6 };
int ret = sizeof(arr)/sizeof(arr[0]);
printf("%d", ret);
return 0;
}
六、一维数组在内存中的储存
#include<stdio.h>
int main()
{
int arr[6] = { 1,2,3,4,5,6 };
int i = 0;
for (i = 0;i < 6; i++)
{
printf("&arr[%d]=%p\n", i, &arr[i]);
}
return 0;
}
结果为:
七、二维数组的创建
1、二维数组的概念
我们前面了解过,一维数组是一群同类型的数据的集合,同理,二维数组我们可以这么理解:
二维数组是一群同类型的一维数组的集合。
整形、整形一维数组、整形二维数组
2、二维数组的初始化
如果我们上面的理解,我们可以这样思考,把一维数组当作一个元素储存到数组中怎么创建数组呢?答案是在变量名后面加上方括号([]),那这样我们就可以得到二维数组的类型:
#include<stdio.h>
int mian()
{
int arr[3][5];
return 0;
}
我们可以理解arr为存放了三个长度为5的int类型一维数组的二维数组;也可以理解为存放了15个int类型的二维数组,前面的三表示有三行,5表示每行有5个元素。
同一维数组的类型一样,二维数组的类型是:int [][]。
八、二维数组的初始化
1、不完全初始化
int arr1[3][5] = {1,2,3,4,5,6,7};
int arr2[3][5] = {0};
我们可以发现,在arr1中第一行的前五个元素占完了之后,数组会自动换行并继续保存,知道数据用完,剩余位置值为0。
2、完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
3、按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
当我们用花括号{}扩起二维数组中的数据时,他就表示这是一行的数据,当储存玩之后会一行的剩余元素补0。
4、初始化时省略行,但是不能省略列
int arr5[][5] = {1,2,3,4,5,6,7};
int arr6[][5] = {{1,2}, {3,4}, {5,6}};
二维数组可以没有行,但必须有列,我们前面提到当一行占满之后之后的数据会自动到下一行储存,如果你不说明一列有几个,那么在数组初始化过程中会一直在第一行储存数据,成了一个一维数组。
八、二维数组的使用
1、二维数组的下标
2、二维数组的输入和输出
同一维数组类似,我们要想访问二维数组的每个元素,我们可以利用下标和for循环。如:
#include<stdio.h>
int main()
{
int arr[3][5] = { 0 };
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;
}
结果为:
九、二维数组在内存中的储存
#include<stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d]=%p\n",i,j ,&arr[i][j]);
}
}
return 0;
}
结果为: