在用二維陣列名作為引數傳遞時容易出現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...