我一直在嘗試理解這兩個定義之間的區別以及如何正確使用它們。
在我看來,定義一個二維陣列,arr[length][width]將矩陣的內容逐行存盤在記憶體中(矩陣本質上是一大行),以便您可以通過這種方式訪問?? i,j 坐標中的數字: *(arr width*i j). 并且當將其發送到函式時,宣告可以是func(int *arr)并且您可以毫無問題地訪問矩陣內容,因為二維陣列在記憶體中的表示方式。
而將陣列定義為int *arr[];似乎不會以相同的線性連續方式將矩陣的內容存盤在記憶體中。函式的宣告必須是func(int **arr) or (int *arr[])。雖然您仍然可以像這樣通過坐標 i, j 訪問矩陣 : arr[i][j],但似乎不可能這樣做:*(arr width*i j)。我是否認為它是正確的,因為以這種方式定義二維矩陣不會將矩陣的行連續存盤在記憶體中,還是我遺漏了什么?
uj5u.com熱心網友回復:
這宣告了一個二維陣列:
int arr1[100][200];
這宣告了一個一維指標陣列:
int *arr2[100];
它們不是同一件事。arr1 包含 20000 個整數,而 arr2 包含 100 個指標。
arr1[20][30] 將計算第 21 行第 31 列的地址并直接到那里。arr2[20][30] 將計算第 21 個指標的地址,讀取指標,計算距離指標指向的位置 30 個整數的地址(如果它指向整數陣列,則為第 31 個整數),然后去那里.
如果愿意,可以為 20000 個整數分配空間,并且可以在 arr2 中保存指向每一行的指標。然后兩者都可用于在行和列中存盤數字。
arr2 的優勢在于,因為每一行都有一個指向實際資料的指標,所以可以有不同大小的行,或者重疊的行,或者缺失的行。在 arr1 中,行的長度正好是 200 個整數,沒有例外。arr2 的缺點是計算機必須做更多它實際上不需要做的作業,即速度較慢。arr2 的另一個缺點是您仍然必須有一個放置 int 的地方,所以如果您的問題是找到一個放置 int 的地方,arr2 實際上并不能解決這個問題。
uj5u.com熱心網友回復:
宣告意味著不同的東西。即使您可以通過相同的語法訪問(讀/寫)整數,x[y]也等同于*(x y).
int *a[]是一維指標陣列。
每個指標可以但不一定指向一維整數陣列。它也可以是空指標或指向單個整數的指標。
如果所有指標都指向一維整數陣列,則這些陣列的大小可以不同。
每個一維陣列,a作為指標陣列和指標指向的每個整數陣列,其所有元素在記憶體中都是連續的。但是這些一維陣列的位置是任意的。
int a[][]是一個二維整數陣列。
所有整數在記憶體中都是連續的。
uj5u.com熱心網友回復:
如果你有這樣的陣列
int arr[length][width];
那么這個*(arr width*i j)訪問陣列元素的運算式是不正確的,至少因為運算式有型別int[width]而不是int 一般當至少i不等于0時會訪問陣列以外的記憶體。
要訪問陣列的元素,您必須使用以下運算式*( *( arr i ) j )。
例如,可以通過以下方式宣告處理陣列的函式
void f( size_t, size_t, arr[*][*] );
或使宣告更具可讀性,例如
void f( size_t rows, size_t cols, arr[][cols] );
至于這個陣列
int * arr[length];
這是一個一維陣列,其中每個元素又指向一個單獨的一維陣列,然后您可以使用相同的運算式*( *( arr i ) j )來訪問陣列的元素arr[i][j]。這是因為下標運算子是由這個公式計算的*( *( arr i ) j )。
相應的函式可以宣告為
void f( int * arr[], size_t rows, size_t cols );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483984.html
上一篇:如何減少定義指標函式的函式數量
下一篇:在鏈表函式末尾插入不起作用
