c - 如何使用指针交换数组

标签 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 矩阵。

最佳答案

我不太清楚你想做什么。但是您的代码有一些问题/似乎有问题。

代码无法编译,因为变量 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 的第一个元素。这可能不是你想要的。相反,创建另一个变量进行交换。喜欢:

int temp;
int* hold = & temp;

但是,总的来说,我不明白为什么你想用指针来做到这一点。为什么不使用简单的 array[x][y] 形式。

关于c - 如何使用指针交换数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43013365/

相关文章:

java - 具有最快运行时间的迭代器,用于占位符

c - 我在某个时候失去了我的对象的类型

c - C 中的代数运算

javascript - 如何迭代对象数组并添加属性

java - 需要帮助在 Java 中将数组转换为另一个数组

python - 如何重新循环程序回到开头

c - C 结构点运算符到底做了什么(较低级别的视角)?

c - 为什么 printf 只打印字符串中的第一个单词?

C++ 数组大小以及如何管理大数组?

javascript - 为什么 javascript 遍历元素但同时对所有元素执行 jQuery 函数?