1.1 概念
从逻辑上有行有列的数组,成为二维数组,相对来讲,只有行这种单一线性结构的数组称为一维数组。二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。定义由行和列组成的二维表格形式元素,二维数组其实也就是矩阵基本格式。访问二维数组需要两个值来确定这个二维数组的位置,即某行某列。
1.2 语法结构
1.2.1 二维数组的声明
数据类型 数组名 【行数】【列数】;
eg:int arr[2][3]
行数以及列数代表了该数组结构中有几行几列,必须是整形常量表达式,同时需要大于0。
1.2.2 初始化二维数组
数据类型 数组名【行数】【列数】= {值};
以下是二维数组的完全初始化以及不完全初始化:
1.2.3 访问二维数组
和一维数组一样,使用二维数组也是通过访问二维数组的元素来实现。
语法:
数组名 【行下标】【列下标】;
行下标范围:【0,行数-1】
列下标范围:【0,列数-1】
1.2.4 二维数组的本质
(1)二维数组的逻辑结构如下:
(2)可以通过代码实现看到二维数组的内存结构也是连续的:
因此从计算机的角度来看,不存在二维数组这种物理结构,实际上计算机编译器所理解的二维数组只不过是由若干个一维数组嵌套而成的一维数组,即是一维数组的嵌套。
如上图所示,int a[3][3]二维数组在计算机中的处理,代表了有三个一维数组组成的所谓的二维数组,这也是为什么在初始化时,行数可以省略,而列数不可省略的原因。
int arr2[][3] = { 1,2,3,4,5,6 }; //列数必须写,根据列数自动分配行数;行数可不写, 行数代表元素个数,
图中紫色部分代表行数,它在某种理解上来讲是可变的。它是相对于该一维数组的第一个元素的位置。若按我们认知的二维数组逻辑结构来运行以下代码,会产生’越界‘访问,然而计算机在实际处理中,是可以正常访问的,运行结果如下,是数值4。即访问的是第一个一维数组,相对于第一个元素的第三个位置上的元素。
int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printf("%d", arr[0][3]);
1.2.5 数组的下标具体代表什么
下标:相对于数组的第一个元素的位置。
1.3 二维数组的应用
1.3.1 二维数组的遍历
嵌套循环,外层是行,内层是列
#include<stdio.h>
int main() {
int a[3][3] = { 1,2,3,4,6,8,9,20,24 };
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%d\t", a[i][j]);
}
putchar('\n');
}
}
1.3.2 二维数组的行列置换代码实现
for循环实现:
#include <stdio.h>
int main()
{
int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i, j, t;
//遍历数组 依次打印
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++) {
printf("%d\t", arr[i][j]);
}
putchar('\n');
}
//交换行列上的数据
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++) {
if (i < j) {
t = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = t;
}
}
putchar('\n');
}
printf("**************************************\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++) {
printf("%d\t", arr[i][j]);
}
putchar('\n');
}
return 0;
}
/*
0 2 1 0
0 2 2 0
1 2 2 1
*/
运行结果如下:
标签:arr,一维,int,C语言,---,++,二维,数组 From: https://blog.csdn.net/m0_60631703/article/details/140655857