二維陣列


二維陣列可以理解為陣列的陣列。二維陣列組織為矩陣,可以表示為行和列的集合。

但是,建立二維陣列以實現關聯式資料庫外觀相似的資料結構。它提供了一次容納大量資料的便利性,可以在任何需要的地方傳遞給任意數量的功能。

1. 如何宣告二維陣列

宣告二維陣列的語法與一維陣列的語法非常相似,如下所示 -

int arr[max_rows][max_columns];

它產生的資料結構如下所示 -

上圖顯示了二維陣列,元素以行和列的形式組織。 第一行的第一個元素由[0][0]表示,其中第一個索引中顯示的數位是行的數位,而第二個索引顯示的數位是列的數位。

2.如何存取二維陣列的資料

由於二維陣列的元素可以隨機存取。這與一維陣列類似,可以使用單元格的索引存取二維陣列中的各個單元格。將兩個索引值附加到特定單元格,一個是行號,另一個是列號。

使用以下語法將儲存在二維陣列的任何特定單元格中的值儲存到某個變數x

int x = a[i][j];

其中ij分別是單元格的行號和列號。使用以下程式碼將二維陣列的每個單元格分配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 位元組