二維數組可以理解為數組的數組。二維數組組織為矩陣,可以表示為行和列的集合。
但是,創建二維數組以實現關係資料庫外觀相似的數據結構。它提供了一次容納大量數據的便利性,可以在任何需要的地方傳遞給任意數量的功能。
1. 如何聲明二維數組
聲明二維數組的語法與一維數組的語法非常相似,如下所示 -
int arr[max_rows][max_columns];
它產生的數據結構如下所示 -
上圖顯示了二維數組,元素以行和列的形式組織。 第一行的第一個元素由[0][0]
表示,其中第一個索引中顯示的數字是行的數字,而第二個索引顯示的數字是列的數字。
2.如何訪問二維數組的數據
由於二維數組的元素可以隨機訪問。這與一維數組類似,可以使用單元格的索引訪問二維數組中的各個單元格。將兩個索引值附加到特定單元格,一個是行號,另一個是列號。
使用以下語法將存儲在二維數組的任何特定單元格中的值存儲到某個變數x
。
int x = a[i][j];
其中i
和j
分別是單元格的行號和列號。使用以下代碼將二維數組的每個單元格分配0
值:
for ( int i=0; i<n ;i++)
{
for (int j=0; j<n; j++)
{
a[i][j] = 0;
}
}
3.初始化二維數組
當同時在C語言編程中聲明和初始化一維數組時,不需要指定數組的大小。 但是這不適用於二維數組。必須至少定義數組的第二個維度。
聲明和初始化二維數組的語法如下 -
int arr[2][2] = {0,1,2,3};
二維數組的元素數量總是等於:行數 * 列數 。
示例: 將用戶數據存儲到二維數組並列印。
C語言的實現
#include <stdio.h>
void main()
{
int arr[3][3], i, j;
for (i = 0;i < 3;i++)
{
for (j = 0;j < 3;j++)
{
printf("Enter a[%d][%d]: ", i, j);
scanf("%d", &arr[i][j]);
}
}
printf("\n printing the elements ....\n");
for (i = 0;i < 3;i++)
{
printf("\n");
for (j = 0;j < 3;j++)
{
printf("%d\t", arr[i][j]);
}
}
}
Java語言的實現
import java.util.Scanner;
public class TwoDArray {
public static void main(String[] args) {
int[][] arr = newint[3][3];
Scanner sc = new Scanner(System.in);
for (inti =0;i<3;i++)
{
for(intj=0;j<3;j++)
{
System.out.print("Enter Element");
arr[i][j]=sc.nextInt();
System.out.println();
}
}
System.out.println("Printing Elements...");
for(inti=0;i<3;i++)
{
System.out.println();
for(intj=0;j<3;j++)
{
System.out.print(arr[i][j]+"\t");
}
}
}
}
C#語言的實現
using System;
public class Program
{
public static void Main()
{
int[,] arr = new int[3,3];
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
Console.WriteLine("Enter Element");
arr[i,j]= Convert.ToInt32(Console.ReadLine());
}
}
Console.WriteLine("Printing Elements...");
for (int i=0;i<3;i++)
{
Console.WriteLine();
for (int j=0;j<3;j++)
{
Console.Write(arr[i,j]+" ");
}
}
}
}
4.將二維數組映射到一維數組
在映射二維數組時,大多數人可能會問為什麼需要這種映射。創建二維數組和實現關係資料庫表看起來有相似的數據結構,在電腦記憶體中,二維數組存儲技術類似於一維數組的存儲技術。
二維數組的大小等於行數和數組中存在的列數的乘積。 確實需要將二維數組映射到一維數組,以便將它們存儲在內存中。
一個3 X 3
的二維數組如下圖所示。 但是,需要將此數組映射到一維數組,以便將其存儲到記憶體中。
將二維數組元素存儲到記憶體中有兩種主要技術 -
4.1.行主順序
在行主排序中,二維數組的所有行連續地存儲在記憶體中。 考慮一下上圖中所示數組,它按行主順序的記憶體分配如下所示 -
首先,數組的第一行完全存儲到記憶體中,然後數組的第二行完全存儲到記憶體中,直到最後一行也完全存儲到記憶體中。
4.2.列主順序
根據列主排序,二維數組的所有列都連續地存儲在記憶體中。 上面圖像中所示數組的記憶體分配給出如下 -
首先,數組的第一列完全存儲到記憶體中,然後數組的第二行完全存儲到記憶體中,直到數組的最後一列。
5.計算二維數組隨機元素的地址
由於存在兩種不同的將二維數組存儲到記憶體中的技術,因此也有兩種不同的公式來計算二維數組的隨機元素的地址。
5.1. 按行主順序
如果數組由a[m][n]
聲明,其中m
是行數,而n
是列數,則以行主順序存儲的數組的元素a[i][j]
的地址計算為,
Address(a[i][j]) = B. A. + (i * n + j) * size
其中,B. A.
是基數地址或數組a[0][0]
的第一個元素的地址。
示例:
a[10...30, 55...75], 基地址 array (BA) = 0 , 一個元素的大小 = 4 位元組 。
計算 a[15][68] 的地址為 -
Address(a[15][68]) = 0 +
((15 ? 10) x (68 ? 55 + 1) + (68 ? 55)) x 4
= (5 x 14 + 13) x 4
= 83 x 4
= 332
5.2. 按列主順序
如果數組由a[m][n]
聲明,其中m
是行數,而n
是列數,則以列主順序存儲的數組的元素a[i][j]
的地址計算為,
Address(a[i][j]) = ((j*m)+i)*Size + BA
其中,BA
是數組的基地址。
示例
A [-5 ... +20][20 ... 70], BA = 1020, 元素的大小為 = 8 位元組。計算 a[0][30] 的位置是 -
地址 [A[0][30]) = ((30-20) x 24 + 5) x 8 + 1020 = 245 x 8 + 1020 = 2980 位元組