文章目录
- 前言
- 一、数组的概念
- 二、一维数组
- 1.一维数组的创建
- 2.一维数组的初始化
- 3. 一维数组的使用
- 4.一维数组在内存中的存储
- 三、二维数组
- 1.二维数组的创建
- 2. 二维数组的初始化
- 3. 二维数组的使用
- 4.二维数组在内存中的存储
前言
一、数组的概念(数组是一组相同类型元素的集合)
二~三、一维数组和二维数组的创建和初始化,以及如何使用数组下标访问和使用数组,还讨论了一维数组和二维数组在内存中是如何存储的
一、数组的概念
数组是一组相同类型元素的集合,展开来讲就是:
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
• 数组中存放的多个数据,类型是相同的。
数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。
二、一维数组
1.一维数组的创建
一维数组创建的基本语法如下:
type arr_name[常量值];
存放在数组中的数据被称为数组的元素,数组在创建的时候要指定数组的大小和数组的元素类型。
• type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型。
• arr_name 指的是数组的名字,这个名字根据实际情况,起的有意义就行。
• [ ] 中的常量值是用来指定数组的大小的,这个数组的大小根据实际的需求指定就行。
我们可以根据需要创建不同类型和大小的数组:
int age[20];
char ch[8];
double score[10];
2.一维数组的初始化
有时候,数组在创建的时候,我们需要给定一些初始值,这种就称为数组初始化。
那数组如何初始化呢?数组的初始化⼀般使用大括号,将数据放在大括号中。
(1)完全初始化:在定义数组时对全部数组元素赋予初值
int arr[5] = {1,2,3,4,5};
(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
int arr[5] = {1,2}; //前两个元素初始化为1和2,剩余的元素默认初始化为0
char ch[5] = {'a','b'}; //前两个元素初始化为'a'和'b',剩余的元素默认初始化为'\0'
(3)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
int arr[5] = {1,2,3,4,5};
也可以写成:int arr[] = {1,2,3,4,5};
//虽然没有在方括号中指定数组的大小,但是系统会根据花括号中数据的个数来确定数组的大小
3. 一维数组的使用
C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号,如下:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
在C语言中数组的访问提供了⼀个操作符 [ ] ,这个操作符叫:下标引用操作符。
有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为7的元素,我们就可以使用 arr[7] ,想要访问下标是3的元素,就可以使用 arr[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;
}
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;
}
从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。
三、二维数组
1.二维数组的创建
二维数组创建的基本语法如下:
type arr_name[常量值1][常量值2];
举例说明:
int arr[3][5];
• 3表示数组有3行
• 5表示每⼀行有5个元素
• int 表示数组中的每个元素是整型类型
2. 二维数组的初始化
在创建数组的时候,给定⼀些初始值,被称为数组初始化。
那二维数组如何初始化呢?像一维数组一样,也是使用大括号初始化的。
(1)完全初始化:在定义数组时对全部数组元素赋予初值
int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7}; //可以将所有数据写在一个花括号内来对数组进行初始化
int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}; //也可以将数据放在几个花括号内分行来对数组进行初始化
(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
int arr1[3][5] = {1,2,3,4,5,6}; //前6个元素初始化为1~6,剩余的元素默认初始化为0
int arr2[3][5] = {{1,2},{3,4},{5,6}}; //初始化了每一行的前两个元素,每一行剩余的元素默认初始化为0
(3)在对二维数组元素赋初值时,可以省略行数,但不能省略列数(每一行的元素个数)。如下:
int arr1[][5] = {1,2,3,4,5,6};
int arr2[][5] = {1,2,3,4,5,6,7,8,9,10,11};
//系统会根据赋初值的元素个数和列数来确定二维数组的行数
3. 二维数组的使用
其实二维数组访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯⼀锁定数组中的⼀个元素。
C语言规定,二维数组的行是从0开始的,列也是从0开始的,如下所示:
int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
行号和列号都是从0开始的,只要确定了行和列就能唯⼀锁定数组中的⼀个元素,比如,我们说:第0行,第0列,快速就能定位出1;第2行,第4列,就能定位出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 };
printf("%d\n", arr[0][0]);//1
printf("%d\n", arr[2][4]);//7
return 0;
}
4.二维数组在内存中的存储
像⼀维数组⼀样,我们如果想研究二维数组在内存中的存储方式,也是可以打印出数组所有元素的地址的。代码如下:
#include <stdio.h>
int main()
{
int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
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个字节,所以二维数组中的每个元素都是连续存放的。
如下图所示: