如何使用指针交换数组

时间:2017-03-25 06:37:28

标签: c arrays loops pointers

我的任务是创建一个方阵,这个方阵需要乘以幂n,m代表方阵的大小。

用户输入首先会保存到原始数组和临时数组中。计算总和后,它将保存到结果中,然后我应该将结果数组与临时数组交换。

int main()
{
    // define variables
    int m, n;
    int matrix_1;
    int original[5][5];
    int result[5][5];
    int temporary[5][5];
    int *ptrResult = &result[0][0];
    int *ptrTemp = &temporary[0][0];
    int *hold = &result[0][0];

    // input from user with validations
    do
    {
        printf("Please input an array size in between 1 to 5: ");
        scanf("%d", &m);
    } while (m < 1 || m > 5);

    do
    {
        printf("Please input an integer as the multiplication power: ");
        scanf("%d", &n);
    } while (n <= 0);

    // input for elements in array
    if (m == 1)
    {
        printf("Value of element in matrix R with size M: ");
        scanf("%d", &original[0][0]);
    }
    else {
        for (int i = 0; i < m; i++) {
            for (int k = 0; k < m; k++) {
                printf("[%d][%d] = ", i, k);
                scanf("%d", &original[i][k]);
                temporary[i][k] = original[i][k];
            }
        }
    }

    int sum = 0;
    int a;
    for (int i = 1; i < n; i++) // Power nth
    {   
        for (int c = 0; c < m; c++) // Row
        {
            for (int d = 0; d < m; d++) // Column
            {
                for (int k = 0; k < m; k++)
                {

                    sum += temporary[c][k] * original[k][d];
                }
                result[c][d] = sum;
                sum = 0;                    
            }
            *hold = *(ptrResult + d);
            *(ptrResult + d) = *(ptrTemp + d);
            *(ptrTemp +d) = *hold;
        }    
    }   

我对指针的基本知识非常糟糕,因为它对我来说是一个非常新的概念。

我想要做的是每次我的循环计算其中一个总和,我想将它从结果数组替换为临时数组。忘记提到这个原始矩阵实际上是一个5x5矩阵但是让用户想要m = 3,它只填充5x5矩阵内的3x3矩阵。

2 个答案:

答案 0 :(得分:1)

我不清楚你想做什么。但是你的代码有一些/似乎是错误的。

代码无法编译,因为变量d的使用超出范围。

        for (int d = 0; d < m; d++) // Here d is defined, i.e. in scope
        {
            for (int k = 0; k < m; k++)
            {

                sum += temporary[c][k] * original[k][d];
            }
            result[c][d] = sum;
            sum = 0;                    
        }   // Here d gets out of scope


        *hold = *(ptrResult + d);  // So d can't be used here and
                                   // you'll get a compile error

原则上你的交换代码是可以的,因为它交换了两个值。

        *hold = *(ptrResult + d);          // Put X into temp
        *(ptrResult + d) = *(ptrTemp + d); // Overwrite X with Y
        *(ptrTemp +d) = *hold;             // Overwrite Y with X
                                           // So X and Y has been swapped

但请看一下你的hold指针。它指向什么?

int *hold = &result[0][0];

它指向result中的第一个元素。因此,无论何时交换,都会破坏result的第一个元素。这可能不是你想要的。而是为交换创建另一个变量。像:

int temp;
int* hold = & temp;

但是,总的来说,我不明白你为什么要用指针来做。为什么不使用简单的array[x][y]表单。

答案 1 :(得分:0)

int *ptrResult=&result[0][0];int *hold=&result[0][0];都指向数组的第一个元素。

*hold = *(ptrResult + d);          
*(ptrResult + d) = *(ptrTemp + d); 
 *(ptrTemp +d) = *hold;

避免声明保持为“int。

int hold;