在本篇文章中,我将讲解数组的基本知识,并且会用一些例题来带大家实践一下。
1.基本概念
数组是一组相同类型元素的集合。大体上可以分为一维数组与多维数组。
2.一维数组的创建与初始化
数组创建的基本语法为: type arr_name[常量值](数组中元素的类型+数组名+[]+元素个数)
但是值得注意的是在C99的标准下,[ ]内的值可以为一个变量,构成一个变长数组(但是不能初始化)。比较可惜的是,VS支持了绝大多数C99的标准,但是变长数组并没有被包含在内。
下面用代码来演示数组的初始化:
int arr1[3]={1,2,3};
//创建arr1数组,该数组的元素组成(成员组成为1,2,3三个整型值)
int arr2[2]={1};
//创建arr2数组,对该数组中的首元素初始化为1,但是该数组一共有两个元素,另外一个元素默认初始化为0。注意:该种初始化的方式称为不完全初始化,除开你自己设定的值外,其他元素的初值为0
int arr3[1];
//创建arr3数组,不对其进行初始化,里面元素不会初始化为0。
int arr4[2]={1,2,3};
//创建arr4数组,对其进行初始化,但是初始化项过多,编译器会报错
int arr[]={1,2,3};
//创建arr数组并对其初始化为1,2,3,[]中会通过记录初始化元素的个数来确定数组长度,该数组的长度为3
然后,需要提一嘴的是数组的类型。比如:int arr[3]数组的类型是什么?很多小伙伴会认为是int,但是实则是错了,arr的类型是int [3]。通用公式可以理解为数组元素类型+[元素个数]。
3.一维数组的使用
3.1 数组下标
C语言规定数组有下标,下标是从0开始的,直到元素个数-1截止。
int arr[4]={1,2,3,4};
//比如数组的第一个元素的下标就是0,第二个元素的下标是1,最后一个元素的下标是3
这里就要提一下我们的下标引用操作符[ ]了,有了下标引用操作符,我们就能轻松地访问数组的元素了。
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n", arr[7]);//8
printf("%d\n", arr[3]);//4
return 0;
}
3.2 数组元素的打印
如果想要打印数组的每一个成员元素,其基本方法与变量一致,但是需要加上一个循环产生数组的下标:
#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;
}
3.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++)
{
scanf("%d", &arr[i]);
}
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
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++)
{
printf("&arr[%d] = %p\n ", i, &arr[i]);
}
return 0;
}
使用上述代码能打印数组中每一个元素的地址。注意:打印地址我们使用的占位符是%p。
从结果我们可以分析,随着数组下标的增长,地址由小到大变化,而且我们可以发现相邻的两个元素地址之间相差4,正好为一个整型的长度。因此我们可以得到一个结论:数组在内存中是连续存储的。
5. sizeof关键字的应用
当我们通过循环遍历数组的时候需要知道数组的长度,便于设置循环条件,这里我们常常会用到sizeof这个关键字(其可以计算类型或者变量的大小)。比如:
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr));
return 0;
}
可以看到屏幕上打印了40,计算的是数组所占内存空间的总大小,单位是字节。因为数组中元素的类型是一致的,所以我们只需要将这个总大小除以单个元素的大小即可获取数组的长度。该项操作请读者自己完成,别忘了用一个变量来接收计算结果咯。
6. 二维数组的创建
6.1 基本概念
我们把一维数组做为数组的元素创建的新的数组是二维数组。同理,把二维数组作为数组的元素,创建出的新的数组是三维数组。多维数组以此类推。
6.2 二维数组的创建
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
double data[2][8];
解释如下:
- 3表示数组有3行
- 5表示数组有5列(每一行有5个元素)
- int表示数组的每个元素类型为整型
- arr是数组名
double与之类似
6.3 二维数组的初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
//以上代码为不完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//以上代码为完全初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
//以上代码为按照行来进行初始化
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};
//以上代码为省略行的初始化,注意:可以省略行,但是不可以省略列
7. 二维数组的使用
二维数组的下标引用与一维数组类似,这里就不再叙述了。输入输出,需要用到双层循环,代码如下:
#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;
}
8. 二维数组在内存中的存储
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
打印二维数组元素的地址我们可以观察到每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。