5、一维数组在内存中的存储
在前面的学习中,我详细地讲解了一维数组的知识,接下来探讨一下一维数组在内存中的存储。
C语言中用%p来打印地址,而&符号用于求变量在内存中的地址。
代码:
//一维数组在内存中的存储
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6 };
int size = sizeof(arr) / sizeof(arr[0]);//数组arr的长度
for (int i = 0; i < size; i++)
{
printf("&arr[%d]=%p\n", i, &arr[i]);
}
return 0;
}
结果:

对于上述地址打印有如下注意事项:
(1)上述地址的打印是是十六进制的形式进行打印的
(2)十六进制包含的数字:0 1 2 3 4 5 6 7 8 9 a b c d e f(注意:十六进制是满十六进一)
a代表1,0,b代表11,c代表12,d代表13,e代表14,f对应15
从上述打印的结果来看,相邻元素之间相差ox4(十六进制),该ox4对应的十进制就是4,而对于一个int类型的数据来说,占4个字节空间大小。
那么上述代码运行结果反映了数组中的元素在内存中是连续存储的。
6、二维数组的创建
6.1二维数组的创建
上述我们学习了一维数组相关的知识。如果我们把一维数组作为数组的元素,这时就是二维数组(在后面的学习中将会详细讲解),二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。
6.2二维数组的创建
二维数组创建的语法:
type arr_name[常量值1][常量值2];
type表示该二维数组中元素的数据类型,arr_name是该二维数组的名字。
示例:
int arr[3][5];
该二维数组arr要表达的意思是:
(1)3表示数组有三行
(2)5表示该数组有5列
(3)int表示数组arr中元素的数据类型是int类型
(4)arr是数组名
7、二维数组的初始化
在一维数组的学习中,我们知道可以在创建一维数组的同时可以给该一维数组中的元素进行初始化,
在二维数组中,我们也是可以进行初始化的。
7.1不完全初始化
不完全初始化就是:初始化数据的元素个数少于该二维数组中元素的总个数(注意:当初始化数据的元素个数少于该二维数组中元素的总个数时,没有被初始化的元素默认值为0)
示例:
int arr1[3][5] = { 1,2 };
int arr2[3][5] = { 0 };
数组arr1和arr2初始化的示意图:

7.2完全初始化
完全初始化即:初始化数据的元素个数等于该二维数组中元素的总个数
示例:
int arr1[2][2] = { 1,2,3,4 };
7.3按照行初始化
当按照行进行二维数组初始化的时候,每一行的数据都要用大括号{}括起来。
示例:
int arr4[3][5] = { {1,2},{3,4},{5,6} };
arr4数组初始化示意图:

7.4初始化时二维数组的行可以省略不写,但是列不能省略不写
示例:
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} };
上述代码初始化示意图:

8、二维数组的使用
8.1二维数组的下标
在一维数组中我们知道使用一维数组是通过下标来使用的。其实二维数组也是通过下标来使用的。
对于一维数组来说,通过一个下标就可以访问到一维数组中的元素。对于二维数组而说,二维数组是有行有列的只要确定了行和列就能唯一确定数组中的一个元素,即:通过两个下标就能访问到二维数组中的元素。
C语言规定:二维数组的行和列都是从0开始的。
示例:访问行下标为1,列下标为1的元素
//二维数组的使用
#include<stdio.h>
int main()
{
int arr[2][2] = { 1,2,3,4 };
printf("%d ", arr[1][1]);
return 0;
}
结果:

8.2二维数组的输入与输出
有输出就有输入,对于二维数组,我们可以通过C语言的scanf函数来给二维数组中的元素赋值
//通过C语言的scanf函数来给二维数组中的元素赋值
#include<stdio.h>
int main()
{
int arr[2][4] = { 0 };
//输入
//行号
for(int i=0;i<2;i++)
{
//列号
for (int j = 0; j < 4; j++)
{
scanf("%d", &arr[i][j]);//通过行号和列号唯一确定二维数组中的一个元素
}
}
//输出数据
//行号
for (int i = 0; i < 2; i++)
{
//列号
for (int j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);//通过行号和列号唯一确定二维数组中的一个元素
}
printf("\n");
}
return 0;
}
示例结果:

9、二维数组在内存中的存储
//二维数组在内存中的存储
#include<stdio.h>
int main()
{
int arr[2][4] = { {1,2,3,4},{5,6,7,8} };
//行
for (int i = 0; i < 2; i++)
{
//列
for (int j = 0; j < 4; j++)
{
printf("%p\n", &arr[i][j]);//唯一确定二维数组中的元素
}
}
return 0;
}
结果:

从上述输出的结果来看,每一行内部的每个元素都是相邻的,因为每一个int类型的数据在内存中占4个字节,而从打印地址的信息来看,相邻元素地址信息相差4,所以二维数组中的每个元素都是连续存放的。

被折叠的 条评论
为什么被折叠?



