C:指针和功能2D阵列

时间:2012-11-03 20:03:35

标签: c pointers

我真的是C编程语言的初学者,我已经开始学习指针......我在操作它们时遇到了一些问题。 我想要做的是读取和写入一个矩阵,有2个函数,不使用全局变量(只是指针)...所以我没有成功做到这一点。我搜索了很多关于指针的内容,我试着理解我如何使用它们,但我无法读写那个矩阵我做错了...请,请帮助我(即使有一些有用的关于2DArray&指针的链接)...谢谢!

#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 个答案:

答案 0 :(得分:2)

可能会出现多个错误

将scanf与%s一起用于单个char变量。如果你想输入一个字符,请使用%c(更好的是,使用getc或getchar),因为scanf有它自己的问题。或者将char数组传递给%s。但是你不能像在

中那样将字符串与char进行比较
choice<'0'

同样在scanf之前删除'\ n'。在printf \ n中刷新缓冲区并移动到下一行。在scanf的情况下,在%c或%s之后添加它仍然有意义(因为你指示终结符),但肯定不是在它之前。

此处没有功能指针。它们用于将函数作为参数传递。您只是传递一个数组,默认情况下通过引用传递。所以只需使用

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

在函数定义的参数中,将x视为像

这样的数组
x[a][b] rather than *x[a][b]

当从main传递数组时,只需传递'a',它是由引用本身传递的数组的名称。传递数组的地址毫无意义。

答案 1 :(得分:2)

另一个问题是,当你正在读取数组时,你首先跟随指针(* x),然后添加数组偏移[i] [j]:这可能会让你到达某个内存位置甚至可以访问。由于你传递的是一个指针的数组,你首先要查看数字位置(x [i] [j]),然后按照指针。

编辑:上一位用户更新了他的回答,以反映我在这里给出的第二条建议,所以我删除了它。