【问题标题】:How to print matrix in C using pointers?如何使用指针在 C 中打印矩阵?
【发布时间】:2017-01-17 16:38:11
【问题描述】:

我不明白为什么我的程序的输出如此奇怪。我只是想用指针打印矩阵,但我得到的是:

1 7 3 8 9
10 8 9 3 4

1 7 3 8 9
7 3 8 9 10

我在这里做错了什么?

#include<stdio.h>
#define NK 5
#define NW 2
int sum(int *w);
int main(void) {

    srand(time(NULL));
    int T[NW][NK];
    int i, j;
    for (i = 0; i<NW; i++) {
        for (j = 0; j<NK; j++) {
            T[i][j] = rand() % 10 + 1;
            printf("%d ", T[i][j]);
        }
        printf("\n");
    }
    int *wsk = T;

    printf("\n");
    sum(wsk);

    return 0;
}
int sum(int *w) {
    int i, j;
    int suma = 0;
    printf("\n");
    for (i = 0; i<NW; i++) {
        for (j = 0; j<NK; j++) {
            printf("%d ", *((w + i)+j));
        }
        printf("\n");
    }

}

【问题讨论】:

  • 当您将T 分配给`wsk` 时,编译器应该对您大喊大叫。不要将矩阵视为向量。
  • T 是一个二维矩阵,wsk 是一个向量。在该赋值表达式T“衰减”到指向int (*)[NK] 类型数组的指针,这与int* 不同。如果绝对需要,可以使用&amp;T[0][0],这是存储在矩阵中的第一个元素的地址。
  • *((w + i) + j) --> *((w + (i * NK)) + j).
  • 但我的印象是你有一个 X - Y 问题。似乎您只是不知道如何声明一个接收矩阵的函数,以便您可以使用两个索引正确处理该函数中的元素。在现代 C 中,这很容易,应该是处理矩阵的首选方式。永远不要手动进行索引计算,编译器比你更清楚。
  • @Buszman LP 犯了一个小错误。他的NW 应该是NK。见我上面的版本。

标签: c pointers matrix


【解决方案1】:

如果几何是固定的,你可以用正确的类型声明参数:

int sum(int w[NW][NK]) {
    printf("\n");
    for (int i = 0; i < NW; i++) {
        for (int j = 0; j < NK; j++) {
            printf("%d ", w[i][j]);
        }
        printf("\n");
    }
}

如果你坚持传递一个指向线性化版本的指针:

int sum(int *w) {
    printf("\n");
    for (int i = 0; i < NW; i++) {
        for (int j = 0; j < NK; j++) {
            printf("%d ", w[i * NK + j]);
        }
        printf("\n");
    }
}

【讨论】:

  • 不应该是w[i * NK + j]吗?
  • 我想出了另一个主意。我可以将指针传递给指针吗?
  • @Buszman 指向指针的指针与实际的二维数组不同。你有(int T[NW][NK])一个二维数组,所以没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多