【发布时间】: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*不同。如果绝对需要,可以使用&T[0][0],这是存储在矩阵中的第一个元素的地址。 -
*((w + i) + j)-->*((w + (i * NK)) + j). -
但我的印象是你有一个 X - Y 问题。似乎您只是不知道如何声明一个接收矩阵的函数,以便您可以使用两个索引正确处理该函数中的元素。在现代 C 中,这很容易,应该是处理矩阵的首选方式。永远不要手动进行索引计算,编译器比你更清楚。
-
@Buszman LP 犯了一个小错误。他的
NW应该是NK。见我上面的版本。