【C语言】第四章-数组

第四章 数组

  数组能帮助我们批量定义一些变量,省去我们在需要大量使用变量需要一个个定义变量的麻烦。而且利用数组所定义的变量又一个最大的特点就是这些变量在内存空间上都是连续的。这一章我们将详细介绍数组及其应用。

第1节

一维数组

数组的创建及初始化

  数组是一组同类型元素的集合。数组的定义方式:

        type_t arr_name[const_n]

  数组的创建及初始化示例。

1
2
3
4
5
6
7
8
9
10
11
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//添加头文件
#include <stdlib.h>
int main()//主函数,函数入口
{
int arr1[10];//创建一个10个元素大小的整形数组
int arr2[10] = { 1,2,3 };//创建一个10个元素大小的整形数组,并将前3个元素赋值,未赋值元素默认为0
int arr3[] = { 1,2,3 };//创建一个3个元素大小的整形数组,并且赋值
char arr4[] = "abcdef";//创建一个字符数组用来存储字符串"abcdef"
system("pause");
}

  在数组创建后我依旧建议立刻进行赋值,就像变量创建后也应该立刻进行赋值一样。如果数组不立刻使用我们应该将他们全部初始化为0。我们可以这么写。

          int arr[10] = { 0 };

一维数组的使用

  我们可以通过数组名[下标]的方式来取到数组中的某一个元素,不过值得说明的是,数组中的下标是从0开始的,也就是说,下标的最大值 == 数组元素总个数 - 1。下面是数组使用的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//添加头文件
#include <stdlib.h>
int main()//主函数,函数入口
{
int arr[10] = { 0 };//数组的创建及初始化
//计算数组元素的个数
int sz = sizeof(arr) / sizeof(arr[0]);
//让数组中每个元素的值等于在数组中的下标
for (int i = 0; i < sz; i++)
{
arr[i] = i;
}
//打印数组的内容
for (int i = 0; i < sz; i++)
{
printf("%d\t", arr[i]);
}
printf("\n");
system("pause");
}

一维数组在内存中的存储

  数组在内存中的存储是连续的, 不间断的,也正因此我们才可以通过下标来逐个访问到数组的每一个元素。同时数组名就是数组元素的首地址。

  数组在内存中的存储时连续的我们可以通过以下这个程序来进行验证。

1
2
3
4
5
6
7
8
9
10
11
12
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//添加头文件
#include <stdlib.h>
int main()//主函数,函数入口
{
int arr[10] = { 0 };
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
system("pause");
}

  从程序执行结果大家就可以看出,整形数组中每个元素的地址之间刚好间隔4个字节,也就是一个整形的空间大小,因此可以得出结论,数组中元素在内存中都是连续排列的。

二维数组

二维数组的定义及初始化

  我们可以使用以下的语法进行对一个二维数组的定义:

          int arr[3][4];

  在这个例子中我定义了一个三行四列的二维数组。在定义之后我们即可对它进行初始化,而二维数组的初始化和一维数组极为相似。

  二维数组定义及初始化示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//添加头文件
#include <stdlib.h>
int main()//主函数,函数入口
{
int arr1[3][4] = {
{1, 2, 3, 4},
{2, 2, 3, 4},
{3, 2, 3, 4},
};
//定义的数组是这样的
// 1 2 3 4
// 2 2 3 4
// 3 2 3 4
int arr[3][4] = { 1, 2, 3, 4 };
//定义的数组是这样的
// 1 2 3 4
// 0 0 0 0
// 0 0 0 0
int arr[3][4] = {
{1, 2},
{3, 4},
};
//定义的数组是这样的
// 1 2 0 0
// 3 4 0 0
// 0 0 0 0
int arr[][4] = {
{2, 3},
{4, 5},
};
//定义的数组是这样的
// 2 3 0 0
// 4 5 0 0
system("pause");
}

  这这段示例中可以看出二维数组与一维数组定义十分相似,但是不同的是二维数组的列下标在定义时不能省略,而行下标是可以省略的。

二维数组的使用

  二维数组的使用也和一维数组类似,不过我们这时候要是想要取得元素中的某个下标我们需要用两个下标来进行表示,两个下标也都是从0开始计数的。因此我们要想遍历一个二维数组至少需要使用两重循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//添加头文件
#include <stdlib.h>
int main()//主函数,函数入口
{
int arr[3][4] = { 0 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
arr[i][j] = 4 * i + j;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
system("pause");
}

二维数组的存储

  二维数组与一维数组一样在内存中存储元素都是相连着的,在这里我们不再细致讨论。

数组作为函数参数

  数组传入函数时,会将数组隐式转换为指针。因此在数组传入函数时并不会记录原数组的长度大小等信息,需要我们传值进去。

1
2
3
4
5
//一定要设置一个参数用来传入函数的大小
void bubble_sort(int arr[], int sz)
{
......
}

-------------本文结束感谢您的阅读!-------------
记录学习每一分,感谢您的赞助