【问题标题】:C - Transposing a multidimensional array using pointer arithmeticC - 使用指针算法转置多维数组
【发布时间】:2014-10-28 04:10:36
【问题描述】:

我一直在尝试使用指针算法交换二维 (MxM) 数组中的两个值,但似乎无法掌握所涉及的指针魔法。

这是我目前得到的:

typedef int Marray_t[M][M];

void transpose(Marray_t A) {
    int i, j;
    int *startAddress = &A[0][0];
    for (i=0; i<M; i++) {
        for (j=0; j<M; j++) {
            int* y = startAddress + (i*M+j);
            int* u = startAddress + (j*M+i);
            int temp;
            temp = *y;
            *y = *u;
            *u = temp;
        }
    }
}

但是,我似乎在交换指针或指针值,而不是更改数组中的实际值。

这是我正在尝试优化的较慢版本:

void transpose(Marray_t A) {
        int i, j;
        for (i=0; i<M; i++) {
            for (j=0; j<M; j++) {
                int temp;
                temp = A[i][j];
                A[i][j] = A[j][i];
                A[j][i] = temp;
            }
        }
    }

【问题讨论】:

  • 使用调试器并跟踪您的代码。这使您能够在程序执行期间检查所有值,这反过来可能会带来启发。

标签: c arrays pointers multidimensional-array transpose


【解决方案1】:

您似乎将值交换了两次,结果是相同的值。

你应该将循环重写为

for (i=0; i<M; i++) {
    for (j=0; j<i; j++) {

Live example here

【讨论】:

  • 按照您的建议,我在第二个 for 循环中将 M 换成了 i。我的代码突然起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多