概念
有两个下标的数组称为二维数组,一个代表行号,一个代表列号。
定义
存储类型 数据类型 数组名[行号][列号];
例:
int arr[2][4];
//定义一个 数组名为arr的 2行 4列的 二维数组。
注意
二维数组(或多维数组)是逻辑上的二维(或多维),本质上都是一维数组,在内存上是连续的
只不过,增加了行号,相当于按行偏移时,每次偏移的宽度为列宽。
二维数组访问
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义一个二维数组
int arr[2][3];
//二维数组的数组名也是常量,不能被赋值
//int arr2[2][3];
//arr2 = arr;---错误的
//arr++; ---错误的
//二维数组元素的赋值
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
//二维数组在内存上也是连续的
printf("%p\n",&arr[0][0]);
printf("%p\n",&arr[0][1]);
printf("%p\n",&arr[0][2]);
printf("%p\n",&arr[1][0]);
printf("%p\n",&arr[1][1]);
printf("%p\n",&arr[1][2]);
//二维数组的访问
printf("%d\n",arr[0][0]);
printf("%d\n",arr[0][1]);
printf("%d\n",arr[0][2]);
printf("%d\n",arr[1][0]);
printf("%d\n",arr[1][1]);
printf("%d\n",arr[1][2]);
return 0;
}
二维数组的遍历
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[2][3];
//二维数组元素的赋值
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
//二维数组的遍历
int i = 0,j = 0;
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
printf("%-5d",arr[i][j]);
}
printf("\n");
}
//二维数组的大小
printf("sizeof(arr) = %ld\n",sizeof(arr));//2 * 3 * sizeof(int)
return 0;
}
二维数组的初始化
#include <stdio.h>
int main(int argc, const char *argv[])
{
//初始化的方法1
//以行为单位进行初始化---完全初始化
//int arr[2][3] = {{1,2,3},{4,5,6}};
//初始化的方法2
//无需以行为单位---完全初始化
//int arr[2][3] = {1,2,3,4,5,6};
//初始化的方法3
//以行为单位进行初始化---不完全初始化
//int arr[2][3] = {{1,2},{4}};
//初始化的方法4
//不以行为单位进行初始化---不完全初始化
//int arr[2][3] = {1,2,3,4};
//初始化的方法5
//都初始化成0
//int arr[2][3] = {0};
//int arr[2][3] = {{0},{0}};
//出使化的方法6
//不指定下标的初始化
//注意:行号可以不写,但是列号必须写
//因为列号决定了按行偏移时的跨度
//----对于这种写法,即使给定的值的个数不是列数的整数倍,也会分配整数倍的内存
int arr[][3] = {1,2,3,4,5};
//printf("%ld\n",sizeof(arr)); --输出 24
//二维数组的遍历
int i = 0,j = 0;
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
printf("%-5d",arr[i][j]);
}
printf("\n");
}
return 0;
}
练习
定义一个二维数组并完全初始化,找到数组中最大的元素及其对应的行号列号
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[3][4] = {{23,45,21,11},{56,78,98,70},{11,98,33,44}};
int hang = 0;
int lie = 0;
int i = 0, j = 0;
//找到最大值,(第一个)
for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
if(arr[hang][lie] < arr[i][j]){
hang = i;
lie = j;
}
}
}
//打印所有和最大值相等的元素的值及行列号
for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
if(arr[hang][lie] == arr[i][j]){
printf("最大元素为 %d,最大元素的行号为%d,最大元素的列号为%d\n",
arr[i][j],i,j);
}
}
}
return 0;
}