2016-12-06 140 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

使用指针算法没有这样的优势,它只是访问数组的另一种方式。 然而,第一种情况很容易编写和调试。