1. 程式人生 > >二維陣列與一維陣列在應用中的區別

二維陣列與一維陣列在應用中的區別

我們在將一個整型的一維陣列名作為函式形參時常常使用 int arr[]或int *arr[],但在將一個整型的二維陣列名作為函式形參時使用int brr[][]卻錯誤,這是為什麼呢?

下面我們將一維和二維陣列將以區分:


由此我們知道

一維陣列中arr它是一個指向整型元素的指標,而brr它是一個指向整型的一維陣列的指標(陣列指標),而不是指向整型元素元素地址的指標,因此我們在使用二維陣列作為函式形參時應註明,所以應使用 int (*brr)[4];  注意:()不能少

若定義成int *brr[4]則表示有一個一維陣列brr[4],該陣列中的所有元素都是(int *)型別的元素(指標陣列)。

例項:

#include<stdio.h>

void testBrr(int (*brr)[4], int m)  
{  
    for(int i = 0; i < m; ++i)  
        for(int j = 0; j < 4; ++j)  
        {  
            printf("a[%d][%d] = %d\n", i, j, brr[i][j]);  //也可以使用*(*(brr+i)+j);
        }  
}  
  
int main()  
{  
    int brr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8},{9,10,11,12}};  
    testBrr(brr, 3);  
} 

結果:


但是此時因為它標註了這個陣列的大小,若其他長度不相等的陣列呼叫此函式時會出現問題,所以應繼續修改。

在上面我們知道brr[0]是指向二維陣列首元素的地址,所以我們可以在函式形參時使用 int *brr或int brr[],在實參部分使用brr[0]

例項:

#include<stdio.h>

void testBrray(int *brr, int m, int n)  
{  
    for(int i = 0; i < m; ++i)  
        for(int j = 0; j < n; ++j)  
        { 
            printf("brr[%d][%d] = %d\n", i, j, *(brr + i * n +j));//必須使用*(brr + i * n +j)而不能使用brr[i][j]
  
        }  
}  
  
int main()  
{  
	int brr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8},{9,10,11,12}};  
    testBrray(brr[0], 3, 4);  
} 

結果:

由此我們知道此方法可行

當然有人會問為什麼輸出時必須使用*(brr + i * n +j) 而不能使用brr[i][j]這是因為二維陣列它雖然看起來是一行一行進行排列,但實際是所有元素在同一行,即第二行的第一個元素brr[1][0]在第一行的最後一個元素brr[0][3]後面

證明:

#include<stdio.h>

int main()  
{  
	int brr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8},{9,10,11,12}};  
	printf("brr[%d][%d]的地址=%d\nbrr[%d][%d]的地址=%d\n",0,3,&brr[0][3],1,0,&brr[1][0]);
   
} 

結果:


由結果看出brr[1][0]與brr[0][3]的地址相差4個位元組(1個int長度),驗證了二維陣列是在一行進行排列的。

當然我們也可以在傳遞實參時將brr這個陣列指標強轉為整形指標,在呼叫時傳遞實參(int *)brr

例項:

#include<stdio.h>

void Show(int *arr,int m,int n)
{
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
		  printf("%3d",*(arr+n*i+j));  //必須使用*(brr + i * n +j)而不能使用brr[i][j]
 
		}
		printf("\n");
	}
}


int main()
{
	int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
   Show((int *)arr,3,4);
   return 0;
}

結果: