2016-12-06 109 views
0

在二維陣列帶指針和常規指針的二維數組? (C語言)

arr[a][b] = *((int *)arr + a * numberOfColumns + b)) 

如果你還沒有見過這個,添加 工作原理如下標量的指針運算:

前)(3*2 + 2)將增加8這相當於&(arr[8]) - (儘管它必須寫爲(3*2 + 2)

第二種方法比第一種方法有什麼優點嗎?

使用x[a][b]方法編碼:

void SortHand(int arr[][2]); 

void main() 
{ 
    int firstArray[5][2] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; 
    SortHand(firstArray); 
    printf("%d", firstArray[3][0]); 
    while (!_kbhit()); 
} 

void SortHand(int firstArray[][2]) 
{ 
    firstArray[3][0] = 14; 
} 

使用*((int *)arr + a * numberOfColumns + b))方法代碼

void SortHand(int *arr[]); 

void main() 
{ 
    int numberOfColumns = 2; 
    int arr[][2] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; 
    SortHand((int **)arr); 
    printf("Number: %d", *((int *)arr + 3 * numberOfColumns + 0)); 
    while (!_kbhit()); 
} 

void SortHand(int *arr[]) 
{ 
    int numberOfColumns = 2; 
    int rowNumber = 3; 
    int columnNumber = 0; 

    *((int *)arr + 3 * numberOfColumns + 0) = 14; 
} 
+2

在第二種方法中需要這些轉換的事實很好地表明您聲明的類型是錯誤的。 – interjay

+0

第二種方法顯然不太可讀,恕我直言。 – Barmar

+0

第二種方法也比較冗長,容易搞砸。我無法想象爲什麼有人會喜歡它,或者它可能有什麼優勢。你有沒有對此有特定的想法? –

回答

3

在二維陣列

arr[a][b] = *((int *)arr + a * numberOfColumns + b))

這並不完全正確;它實際上是

arr[a][b] == *(*(arr + a) + b) 

您的版本假設行是連續的,對於某些動態分配的數組可能不是這種情況。

第二種方法比第一種方法有什麼優勢嗎?

這是很難讀,更難寫,容易得到錯誤的,並有可能不提供性能優勢。它也將倒下很難分配如下

T **arr = malloc(sizeof *arr * N); 
if (arr) 
{ 
    for (size_t i = 0; i < N; i++) 
    { 
    arr[i] = malloc(sizeof *arr[i] * M); 
    } 
} 

非連續陣列,因爲行會不會在內存中相鄰,但arr[i][j]將永遠做正確的事情。

下標操作符存在的原因 - 不妨使用它。

0

使用指針算法沒有這樣的優勢,它只是訪問數組的另一種方式。 然而,第一種情況很容易編寫和調試。