You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

N×N数组作为函数参数传递时指针类型不兼容问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:11:47