使用指针算法访问2d数组

时间:2015-10-05 01:56:33

标签: c arrays pointer-arithmetic

我有一个数组A[n][n]我怎么能这样访问它:*A+i*blockSize*dimenson?这不是转换为A[i*blockSize*n]吗?

如果i*blockSize*n是一个大于n的数字,怎么可能呢?我认为它有效,因为C中的2d数组实际上只是一块连续的内存。但是,这并没有改变我无法在不发生运行时错误的情况下编码A[i*blockSize*n][j] = something的事实。

为什么*A+i*blockSize*dimenson可以,但不是A[i*blockSize*n]

我希望这个问题对于C语言专家来说是有意义的。

2 个答案:

答案 0 :(得分:0)

  

不会转换为A[i * blockSize * n]

不,它没有 1

*A + i * blockSize * dimenson

实际上相当于

A[0] + i * blockSize * dimension

您需要阅读operator precedence,正确的等效表达式是

*(A + i * blockSize * dimenson)

但这不是必要的,因为它会使代码更难以阅读,而根本不会给你带来任何好处。

1 请为运算符使用周围空格,以便于区分运算符和操作数。

答案 1 :(得分:-1)

首先:

*(A+i*blockSize*dimenson)

转换为:

A[i*blockSize*dimenson]

你根本做不到:

A[i*blockSize*n][j] = something

如果i*blockSize*n大于n,因为你将超出你分配的数组的边界,其大小为n乘以n。

但你可以这样做:

A[i][j] 

为:

B[i*n+j]

如果将B声明为指向A的一维数组,例如:

int A[n][n];
int * B = (int *)A;