C语言:指针和函数2D数组

3

我是C编程语言的初学者,现在开始学习指针... 我在操作它们时遇到了一些问题。我的目标是使用两个函数读取和写入矩阵,而不使用全局变量(只使用指针)...但是我没有成功。我已经搜索了很多关于指针的资料,尝试理解如何使用它们,但是我无法读取和写入那个矩阵。我做错了什么...请,请,请帮帮我(甚至提供一些有关二维数组和指针的有用链接)...谢谢!

#include <stdio.h>
#include <stdlib.h>

void readM(int (*x)[100][100], int *row, int *column)
{
int i,j;
printf("Row no: ");
scanf("%d",row);
printf("Column no: ");
scanf("%d",column);
printf("Matrix elemnts: \n");    
for(i=0;i<(*row);i++)
{
    for(j=0;j<(*column);j++)
    {
        printf("[%d][%d]=",i,j);
        scanf("%d",x[i][j]);
    }
}
}

void writeM(int (*x)[][100], int *row, int *column)
{
int i,j;
printf("\nMatrix is: \n");
for(i=0;i<(*row);i++){
    for (j=0;j<(*column);j++){
    printf("%d",(*x)[i][j]);
    }
    printf("\n");
    }
}

int main()
{

char choice;
int a[100][100],m,n;
do
{
   printf("\nChose an option\n\n"
      "1) read matrix \n"
      "2) write matrix\n"
      "3) display matrix in spiral\n"
      "4) return max and min\n"
      ///...etc
   scanf("%c", &choice);
   while (choice<'0'|| choice>'4')
         {
            printf("\nInvalid option! Chose again! \n\n");
            scanf("%c",&choice);
         }
   switch (choice)
   {
        case '0': exit(0);
        case '1': readM(&a,&m,&n); break;
        case '2': writeM(&a,&m,&n);break; /// ... etc
} while (choice !=5);
getch();
}

2
有很多混乱的代码,甚至无法编译,有不匹配的大括号。而且你使用了一些只有你自己能理解的语言(抱歉)。如果它不是英语,请将其从代码中删除并粘贴到有问题的部分。 - fkl
抱歉,您的输入不是英语。 - ionut
1
阅读comp.lang.c FAQ的第6节。 - Keith Thompson
我认为你应该能够阅读非英语的字符串和变量名,并且可以忽略非英语的注释。代码应该是可理解的,即使不理解名称也可以。我同意复制的代码应该是可编译的,即使修改后的代码仍然无效。 - Jonathan Leffler
始终检查 scanf() 是否转换了您期望的值数量:if (scanf(...) != 3) { ...处理错误... } 如果您尝试读取3个值。这可以避免各种问题。 - Jonathan Leffler
显示剩余2条评论
2个回答

2

可能会有不止一个错误

使用scanf和%s来读取单个字符变量。如果您想要输入一个字符,请使用%c(最好使用getc或getchar),因为scanf存在自己的问题。或者将一个字符数组传递给%s。但是,然后您无法像在中所做的那样将字符串与字符进行比较。

choice<'0'

在 scanf 之前移除 '\n'。在 printf 中,\n 会刷新缓冲区并移到下一行。在 scanf 中,即使在 %c 或 %s 之后添加 \n 仍然有些意义(因为您正在指定终止符),但绝对不应该在其之前添加。

这里没有函数指针。它们用于将函数作为参数传递。你只是默认传递了一个按引用传递的数组。所以简单地使用

int x[100][100] or int x[][100]

在函数定义的参数中,将 x 视为类似于数组

x[a][b] rather than *x[a][b]

同样,当从主函数传递数组时,只需传递“a”,这是传递引用本身的数组名称。传递数组的地址是没有意义的。

好的...谢谢...在那行代码里,我的编译器没有返回任何错误或警告,所以我没有看出有什么问题。但是我的问题出在了 readM 和 writeM 函数上。 - ionut
1
我也指出了它们的问题。重新加载答案。同时,将错误或警告视为某些事情出错的唯一手段在类似C语言的语言中非常危险,因为它允许自由地进行很多操作。除非你真正理解代码的含义,否则不要编写任何代码。 - fkl
谢谢...我想问题在于我不理解我的老师说什么。她让我在那些函数中使用指针...这就是我无法掌握的部分...我还要编写一些返回总和并对矩阵进行其他修改的函数...这样会行吗? - ionut
我之前学过Pascal,所以转换到C语言还是比较困难的。 - ionut
2
这没关系,只要在使用前掌握全部概念就好了。或者先阅读语法相关的内容。在函数中使用指针与函数指针毫不相关。后者是另一种指针类型,它们指向函数而非简单变量,并可以通过这些指针来调用函数。你所使用的(*x)语法描述的是一个无意义的函数指针,因为缺少相关场景的含义。 - fkl
显示剩余2条评论

2
另一个问题是,当你读取数组时,你首先要遵循指针(*x),然后再添加数组偏移量 [i][j]:这可能会让你到达一些你根本无法访问的内存位置。由于你传递的是指针的数组,所以你应该先查看数字位置(x[i][j]),然后再跟随指针。
编辑:前面的用户更新了他的答案来反映我在这里给出的第二个建议,因此我将其删除。

是的,我看到你后来的回答了。我正在编辑他的代码并且同时回答问题。因为你先提到了这个问题,所以我给你点了赞。 - fkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接