二維陣列名如何作為引數傳遞

2021-07-01 20:19:54 字數 1383 閱讀 2244

在用二維陣列名作為引數傳遞時容易出現segmention error。這是因為不能正確為二維陣列中元素定址的問題,正確的方法如下:

[cpp]view plain

copy

#include 

#include 

#define n   4  

void

testarray(

int*a, 

intm, 

intn)    

}    

intmain()    

, };    

testarray((int

*)a, 2, n);    

}    

1. 將二維陣列的兩個維度用變數的形式傳遞過去

如下所示:

[cpp]view plain

copy

#include 

#include 

#define n   4

void

testarray(

int**a, 

intm, 

intn)  

}  intmain()  

, };  

testarray((int

**)a, 2, n);  

}  

此時在子函式中不能使用a[i][j]的形式訪問陣列元素,因為陣列元素都是順序儲存,位址連續,在使用a[i][j]訪問陣列元素時,無法順序訪問到指定的元素,所有我們只能通過計算指定所要訪問的元素。

2、用指向一維陣列的指標變數,如下例子所示:

[cpp]view plain

copy

#include 

#include 

#define n   4  

void

testarray(

int(*a)[4], 

intm, 

intn)    

}    

intmain()    

, };    

testarray(a, 2, n);    

}    

int (*a)[n] 表示指向一維陣列的指標變數,即a所指向的物件是含有4個整型元素的陣列。注意 () 不能少,若定義成:

int *a[n] 則表示有乙個一維陣列a[n],該陣列中的所有元素都是 (int *)型別的元素。

在這裡,在子函式中訪問二維陣列中的元素可以用 a[i][j] 或者 *(*(a+i)+j)

在這種情況下(*(a+i))[j],a [i * n +j]);,*(*(a+i)+j),a[i][j],*((int*)a + i * n +j)都可以進行訪問。

二維陣列名不能作為指標傳遞

二維陣列名即陣列位址,指向首行位址,表面上看,行位址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。如果a 10 10 假設int p a 那麼要對行遞增執行p 時,編譯器如何知道列寬?因為int 是指指向乙個 int 型別的指標,32位系統中...

二維陣列名做引數傳遞問題

在用二維陣列名作為引數傳遞時容易出現segmention error。這是因為不能正確為二維陣列中元素定址的問題,正確的方法如下 1.用指向一維陣列的指標變數,如下例子所示 cpp view plain copy print?include include define n 4 void testa...

二維陣列名做引數傳遞問題

在用二維陣列名作為引數傳遞時容易出現segmention error。這是因為不能正確為二維陣列中元素定址的問題,正確的方法如下 1.用指向一維陣列的指標變數,如下例子所示 cpp view plain copy print?include include define n 4 void testa...