N×N数组作为函数参数传递时指针类型不兼容问题求助
我编写了一个用于排序N×N数组的程序,编译能通过,但因为指针类型不兼容无法正常运行。调用swap和dblArraySort函数时均出现「incompatible pointer type」警告,请问问题出在哪?
以下是我的代码:
#include <stdio.h> #include <stdlib.h> void swap(int **a, int **b) { int temp; temp = **a; **a = **b; **b = temp; } void dblArraySort(int **dblArray, int arrLen) { int chkIndex; int i, j, k; for (i = 0; i < arrLen; i++) { if ((i + 1) % 2 == 0) { for (j = 0; j < arrLen; j++) { chkIndex = dblArray[i][j]; for (k = 1; k + j < arrLen; k++) if (chkIndex < dblArray[i][k + j]) swap(&dblArray[i][j], &dblArray[i][k + j]); else continue; } } else { for (j = 0; j < arrLen; j++) { chkIndex = dblArray[i][j]; for (k = 1; k + j < arrLen; k++) if (chkIndex >= dblArray[i][k + j]) swap(&dblArray[i][j], &dblArray[i][k + j]); else continue; } } } } int main() { unsigned int arrayLength; printf("Provide array size: \n"); scanf("%d", &arrayLength); int doubleArray[arrayLength][arrayLength]; for (int i = 0; i < arrayLength; i++) { for (int j = 0; j < arrayLength; j++) { scanf("%d", &doubleArray[i][j]); } } dblArraySort(doubleArray, arrayLength); for (int i = 0; i < arrayLength; i++) { for (int j = 0; j < arrayLength; j++) { printf("%d ", doubleArray[i][j]); } printf("\n"); } return 0; }
我已尝试运行上述代码,但警告导致程序无法正常工作。
问题原因
1. dblArraySort函数的参数类型不匹配
你在main中定义的doubleArray是变长数组(VLA),类型为int[arrayLength][arrayLength]。当把它传递给函数时,数组会退化为指针,但这个指针的类型是int (*)[arrayLength](指向包含arrayLength个int的一维数组的指针),而不是你函数参数声明的int**。
int**是指向int*的指针,通常用于表示指针数组(比如动态分配的二维数组);而int (*)[N]是指向固定长度一维数组的指针,二者的内存布局和类型完全不同,编译器会认定这是不兼容的指针类型。
2. swap函数的参数类型不匹配
swap函数声明的参数是int**(指向int*的指针),但你调用时传递的是&dblArray[i][j]。dblArray[i][j]是一个int类型的元素,它的地址是int*类型,和int**类型不兼容。
实际上,你要交换的是两个int变量的值,根本不需要二级指针,传递int*类型的指针(即变量的地址)就足够完成交换操作。
修正方案
修正swap函数
把参数改成int*,直接操作指针指向的int值:
void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }
调用时直接传&dblArray[i][j]和&dblArray[i][k+j]即可,此时参数类型完全匹配。
修正dblArraySort函数的参数
因为你用的是变长数组,函数参数可以用arrLen来指定二维数组的列数,声明为指向变长数组的指针:
void dblArraySort(int (*dblArray)[arrLen], int arrLen)
这样参数类型和main中传递的doubleArray退化后的指针类型完全匹配,不会再出现警告。
修正后的完整代码可以正常编译运行,解决指针类型不兼容的问题。
内容的提问来源于stack exchange,提问作者moran a

