将一个二维数组通过指针传递给函数的C语言实现
将一个二维数组通过指针传递给函数的C语言实现
这是我的代码示例(魔方阵):
int magicsqr(int *magic,int size); int main() { int size,*ptr; char stop; repeat: printf("请输入一个奇数作为魔方阵的大小(大于等于3):\n"); scanf("%d",&size); fflush(stdin); ptr=(int*)calloc(size*size,sizeof(int)); while((size%2==0)||(size<=1)) { printf("您输入了一个错误的数字。\n"); repeat1: printf("您是否继续?(Y或N)\n"); scanf("%c",&stop); fflush(stdin); if(stop=='Y'||stop=='y') goto repeat; else if(stop=='N'||stop=='n') printf("感谢您尝试我们的测试版程序。\n"); else { printf("您输入了一个错误的字符。\n"); goto repeat1; } } magicsqr(ptr,size); return 0; } int magicsqr(int *magic,int size) { int i,j,num; i=1; j=(size+1)/2; for(num=1;num<=size*size;num++) { *(magic+i*size+j)=num; if(num%size==0){ i++; continue; } if(i==1) i=size; else i--; if(j==size) j=1; else j++; } for(i=1;i<=size;i++) { printf("\n"); for(j=1;j<=size;j++) printf("%d\t",*(magic+i*size+j)); } }
所以我有几个困惑的问题。
1- 据我所知,`Arr[i][j]==*(Arr[i]+j)`,为什么只有`*(magic+i*size+j)`起作用?
2- 我在使用指针将二维数组传递给函数方面阅读了很多文章,但仍然感到困惑,如何在这段代码中表示一个二维数组或更多维数组。
3- 我还是一个编程初学者,希望您能解释一下。
非常感谢大家,最后我使用了指针到指针和指针数组,成功了。
问题的出现原因:这段代码中,我们需要创建一个二维数组并将其传递给一个函数。然而,这里使用了二级指针来分配二维数组的内存空间,这可能导致一些问题。
解决方法:为了解决这个问题,我们可以使用一级指针来分配内存空间,并使用一个循环来为每个指针分配内存。这样就可以正确地传递二维数组给函数。
以下是修改后的代码:
int main() { char stop; int i,j,size,num; repeat: printf("Please Enter an Odd number for the magic square(3 or greater):\n"); scanf("%d",&size); fflush(stdin); int **magic = malloc(size*sizeof(int*)); if((size%2==0)||(size<=1)) { printf("You entered a wrong number.\n"); repeat1: printf("Do you wish to continue?(Y or N)\n"); scanf("%c",&stop); fflush(stdin); if(stop=='Y'||stop=='y') goto repeat; else if(stop=='N'||stop=='n') printf("Thanks for trying our beta program.\n"); else { printf("You entered a wrong character.\n"); goto repeat1; } } for(i=0;i
Passing 2 dimensional array into a function using pointer C 这个问题的出现原因是因为作者对于在C语言中使用指针将二维数组传递给函数这一概念存在一定的困惑。作者通过阅读相关资料后仍然不能确定如何在代码中表示一个二维数组。
解决方法是查看正确的二维数组传递方式。在这个问题的回答中,有人提供了正确的方法链接:correct way of passing 2D array.
另外,在回答中还有一个相关的问题,即为什么只有`(magic+isize+j)`这种方式可以正常工作。有人解释说,在使用`calloc`函数分配内存时,不需要对返回值进行强制类型转换。而`ptr`是一个一维数组指针,所以`(magic+isize+j)`其实是将二维索引转换为一维索引以访问数组的方式。
综上,通过阅读正确的二维数组传递方式以及了解`calloc`函数的用法,作者可以解决自己的困惑,并正确地将二维数组传递给函数。
在这个问题中,出现了将一个二维数组通过指针传递给函数的情况。然而,实际上这不是一个真正的二维数组,而是一个用来模拟二维数组的一维数组。所以,内存分配是使用calloc(size*size,sizeof(int))
来分配一维数组的空间,大小为(size * size)
。
数据的访问是通过*(magic+i*size+j)=num
这样的方式进行的。每个元素的位置是通过从基索引中添加行数
* i
+ j
来计算的。这被称为扁平数组。
如果想要将其更改为真正的二维数组,需要进行很多的修改。需要修改ptr的声明、内存分配、函数调用、函数声明以及函数的实现,使其接受一个二维数组而不是一维数组。之后,需要重新编译代码并查看是否需要进行其他的修改。如果代码能够正常工作,那么我认为这个努力是不值得的。
如果你想更好地理解,可以尝试使用双指针来重新编写整个代码。这样你会有更深入的理解。