以下代码:
#include <stdio.h>
void printSpiral(int **M, int row1, int row2, int col1, int col2) {
if (!((row1 <= row2) && (col1 <= col2)))
return;
int i;
for (i = col1; i <= col2; i++)
printf("%d ", M[row1][i]);
for (i = row1; i <= row2; i++)
printf("%d ", M[i][col2]);
for (i = col2; i >= col1; i--)
printf("%d ",M[row2][i]);
for (i = row2; i >= row1; i--)
printf("%d ",M[i][col1]);
printSpiral(M,row1+1,row2-2,col1+1,col2-1);
}
int main() {
int n;
scanf("%d",&n);
int M[n][n];
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d",&M[i][j]);
printSpiral(M,0,n-1,0,n-1);
return 0;
}
发出以下警告:
spiral.c: In function ‘main’:
spiral.c:26:3: warning: passing argument 1 of ‘printSpiral’ from incompatible pointer
type [enabled by default]
printSpiral(M,0,n-1,0,n-1);`
spiral.c:3:6: note: `expected ‘int **’ but argument is of type ‘int (*)[(sizetype)(n)]’`
void printSpiral(int **M, int row1, int row2, int col1, int col2) {
我第一次看到这个警告。这是什么意思?
答案 0 :(得分:10)
此代码存在两个问题。首先,您传递int (*)[(sizetype)(n)]
的参数(指向n
整数数组的指针,这是您的2D数组M
在将其传递给函数时衰减到您的函数的类型)期待int **
的争论。永远记住 数组不是指针 。一种可能的解决方案是您可以将函数的第一个参数更改为int (*)[(sizetype)(n)]
类型。
void printSpiral(int (*M)[n], int row1, int row2, int col1, int col2) {
但是通过这样做,第二个问题将会浮出水面,因为你将M
声明为可变长度数组,并且函数不知道n
。可以通过将n
从main
传递到您的函数来解决此问题,从而将您的函数定义更改为
void printSpiral(int n, int (*M)[n], int row1, int row2, int col1, int col2) {
答案 1 :(得分:2)
编译器想告诉您函数需要int **
,但是为它提供类型为int (*)[(sizetype)(n)]
的参数。
第一个是指向({1}}数组的第一个元素的指针,第二个是指向给定长度的数组/数组的指针。
比较记忆中的两种意义以及为什么这种方法无法正常工作。
解决方案是为函数提供指向一个元素的指针,至少是总列数。 (如果您希望函数执行边界检查,它也需要行数。)然后您必须手动计算索引。
答案 2 :(得分:0)
你应该知道int a[][]
与int **a
不同,第一个a
与int(* a)[]相同,这意味着一个指向数组的指针;如果你想按int **a
表示二维数组,请参考:C Programming: Initialize a 2D array of with numbers 1, 2, 3