书接上节
4. ⼀维数组在内存中的存储
有了前⾯的知识,我们其实使⽤数组基本没有什么障碍了,如果我们要深入了解数组,我们最好能了解⼀下数组在内存中的存储。
依次打印数组元素的地址:
#define _CRT_SECURE_NO_WARNINGS #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个字节)。所以我们得出结论:数组在内存中是连续存放的。这就为后期我们使⽤指针访问数组奠定了基础(在讲指针的时候我们在讲,这里暂且记住就行)。
5. sizeof 计算数组元素个数
那我们如何计算数组的元素个数呢
sizeof 中C语言是⼀个关键字,是可以计算类型或者变量大小的,其实 sizeof 也可以计算数组的
大小。
#include <stdio.h> int main() { int arr[10] = { 0 }; printf ("%d\n", sizeof(arr)); return 0; }
输出为40,这⾥输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。
那我们怎样计算出arr[]的元素个数呢?
这时候有人就会想到用arr[]的字节去除以一个arr[0],是否就可以计算出来呢,实践开始:
#include <stido.h> int main() { int arr[10] = {0}; int sz = sizeof(arr)/sizeof(arr[0]); printf("%d\n", sz); return 0; }
结果不出所料:10。是不是简单的呢,那我们学习完了一维数组的基础,是不是觉得难度对你来说是不是有点简单了,那我们再接再厉,继续二维数组的学习吧
6. ⼆维数组的创建
二维数组
前面学习的这些数组被称为一维数组,数组的元素都是内置类型的,如果我们把一维数组做为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。
如:
⼆维数组的创建
那我们如何定义二维数组呢?语法如下:
type arr_name[常量值1][常量值2];
例如:
int arr[4][6];
double data[3][6];
解释:上述代码中出现的信息
• 4表示数组有3行
• 6表示每一行有6个元素
• int 表示数组的每个元素是整型类型
• arr 是数组名,可以根据自己的需要指定名字
data数组意思基本⼀致。
二维数组与一维数组一样存在(完全,不完全,按照型初始化)
按照型初始化
如:int arr4[3][5] = {{1,2},{3,4},{5,6}}
1 | 2 | 0 | 0 | 0 |
3 | 4 | 0 | 0 | 0 |
5 | 6 | 0 | 0 | 0 |
明白了吗.注意:初始化时省略行,但是不能省略列 :int arr[ ][5] = {1,2,3,4,5,6,7}
既然我们已经了解到了数组,那我们回到上节课的问题中
7.二维数组的使用
二维数组的输入和输出
其实我们只要能够按照⼀定的规律产生所有的行和列的数字就行;以上一段代码中的arr数组为例,行的选择范围是0~2,列的取值范围是0~4,所以我们可以借助循环实现生成所有的下标。
#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"); //打印完5个数据后,换行 } return 0; }
这样我们就学会了二维数组的输入与输出!!!