书接上节
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;
}
这样我们就学会了二维数组的输入与输出!!!