二維陣列的若干問題

2021-06-21 09:46:24 字數 1610 閱讀 6768

棧:

int a[m][n] = ; 堆:

new int[m][n];

malloc(m * n * sizeof(int));

假設已定義乙個整型二維陣列:

雖然a[0]、a都是陣列首位址,但二者指向的物件不同:①a[0]是一維陣列的名字,它指向的是a[0]陣列的首元素a[0][0],對其進行"*"運算(*a[0])得到的是乙個陣列元素值a[0][0]。可以用

*(a[i]+j)表示該二維陣列第i行、第j列的元素a[i][j]。②a是二維陣列的名字,它指向的是它所屬元素的首元素,它的每乙個元素都是乙個行陣列,因此,它的移動單位是行,所以a+i指向的是第i個行陣列,即指向a[i]。對a進行"*"運算,得到的是一維陣列a[0]的首位址,即*a與a[0]是同乙個值。可以用

*(*(a+i)+j)表示該二維陣列第i行、第j列的元素a[i][j],當i=0,j=0時,**a即為a[0][0]。

如何用乙個指標p指向該二維陣列呢?有int(*p)[n]、int* p、int** p三種方式。

int(*p)[n] =a;//如果是動態申請的陣列,則為int(*p)[n] = new int[m][n];這裡的p與a[m][n]中的a等價

int* p = a[0];//如果是動態申請的陣列,則為int* p = *(new int[m][n]);或者int* p = (int*)(new int[m][n]);

int** p = (int**)a;//如果是動態申請的陣列,則為int* p = (int**)(new int[m][n]);

①如果採用int(*p)[n] = new int[m][n];可以用以下方式引用陣列元素:

p[i][j]

*(p[i]+j)

*(*(p+i)+j)

②如果採用int* p = *(new int[m][n]);可以用以下方式引用陣列元素:

*(p+i*n+j)

③如果採用int** p = (int**)(new int[m][n]);可以用以下方式引用陣列元素:

*(p+i*n+j)

c語言中沒有引用,可以用如下三種方式:

void func(int a[m][n]);//a為二維陣列首行元素的位址

void func(int a[n]);//a為二維陣列首行元素的位址

void func(int (*p)[n]);//p為指向二維陣列首行元素的指標

說明:①一維陣列做形參為void func(int a),不用指定陣列大小,因為這裡形參雖然是陣列形式,但編譯時是將a按指標變數處理的,相當於void func(int *a)。在函式被呼叫時,系統會建立乙個指標變數a,用來存放從主調函式傳遞過來的實參陣列首元素的位址。

②同理,二維陣列做形參時,void func(int a[n]),在函式被呼叫時,系統會建立乙個指標變數a,用來存放從主調函式傳遞過來的實參二維陣列首行元素(含n個元素)的位址。

③陣列名作形參時,傳遞的是指標,因此對陣列元素的操作會改變實參的值。

int& a[m];//錯誤,不能建立元素型別為引用的陣列

有關字元陣列的若干問題

1 給字元陣列char a 10 賦值的方法 定義時直接賦值 char a 10 hello 注意 不能先定義再給它賦值,如 char a 10 a 10 hello 這樣是錯誤的!2 對陣列中字元逐個賦值 char a 10 3 利用strcpy 賦值char a 10 strcpy a,hell...

二維陣列問題

問題 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。解答 思路 從右上角或者左下角開始找 public static void main string args boolean b...

二維陣列排序問題

array array array array array 首先是普通的二維陣列 根據裡面的一維陣列中的某個欄位的值進行排序 排序 根據字段進行排序 params array array 需要排序的陣列 params string field 排序的字段 params string sort 排序順...