C:如何在数组中交换两个对象?

时间:2014-08-07 13:33:57

标签: c arrays

#include <stdio.h>

void t4_trans(int array[3][3]);

int main(int argc, const char * argv[])
{
    //T4
    int array[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    t4_trans(array);

    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 3; j ++)
        {
            printf("%5i", array[i][j]);
        }
        printf("\n");
    }

    return 0;
}

//T4
void t4_trans(int array[3][3])
{
    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 3; j ++)
        {
            int t = array[i][j];
            array[i][j] = array[j][i];
            array[j][i] = t;
        }
    }
}

我写了这段代码,我认为结果应该是:

1 4 7

2 5 8

3 6 9

然而,我得到了这样的输出:

1 2 3

4 5 6

7 8 9

我以为是因为函数t4_trans(...)创建了一个新数组,所以我试图添加

printf("%x", &array);

同时指向main()和t4_trans(...),但是我得到了相同的数组内存地址。

我不知道为什么代码不起作用,如果你知道,请帮助我。

BTW:我在我的MBA上使用xCode 5.1.1,10.9.4

感谢。

1 个答案:

答案 0 :(得分:2)

问题是你的代码有效,但是#34;太好&#34; - 您实际上将矩阵转换两次,为您提供原始矩阵。这是因为您遍历所有元素,例如,当您交换array[0][1]array[1][0]时,稍后的迭代将交换array[1][0]和{{1} ,撤消第一次交换。

相反,您只需要在矩阵的一半处开始交换:

array[0][1]

基本上,这只交换了上面的三角形&#34;与较低的一个。它也会跳过主对角线,因为它不会受到换位的影响。