我真的是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();
}
答案 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]),然后按照指针。
编辑:上一位用户更新了他的回答,以反映我在这里给出的第二条建议,所以我删除了它。