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

使用指针实现二维数组减法遇编译错误:expression must have pointer-to-object type

二维数组减法函数编译错误分析与修复

问题描述

尝试用指针实现二维数组减法函数时,出现编译错误:

expression must have pointer-to-object type but it has type "int"C/C++(142)

原代码如下:

读取数组函数

int *readMatrix(int *arr)
{
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            printf("row %d, col %d: ", i + 1, j + 1);
            scanf("%d", &arr[i * 4 + j]);
        }
    }
    printf("\n");
    return arr;
}

二维数组减法函数

int *subM(int *arrA, int*arrB, int *arrC){
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            //printf("row %d, col %d: ", i + 1, j + 1);
            &arrC[i][j] =  &arrA[i][j] - &arrB[i][j]; // 报错行
        }
    }
    return arrC;
}

主函数

int main()
{
    int arrA[3][4];
    int arrB[3][4];
    int arrC[3][4];

    readMatrix(&arrA[3][4]);
    readMatrix(&arrB[3][4]);
    subM(&arrA[3][4],&arrB[3][4],&arrC[3][4]);
    return 0;
}

错误原因

  1. 指针类型不匹配导致下标错误:arrC是int*类型指针,仅支持一维下标访问。arrC[i][j]会被解析为*(arrC[i] + j),但arrC[i]是一个int值(非指针),对int值做指针偏移操作必然触发类型错误。
  2. 逻辑错误:操作地址而非元素值:&arrA[i][j] - &arrB[i][j]计算的是两个地址的偏移量(单位为int的字节数),不是数组元素的差值。同时,&arrC[i][j]是地址常量,无法被赋值,这本身就是非法操作。
  3. 传参越界:&arrA[3][4]是二维数组的越界地址,arrA的有效范围是arrA[0][0]到arrA[2][3],传递该地址会导致函数访问非法内存。

解决方法

  1. 用一维下标定位元素:对于int*类型指针,通过i*列数 + j的方式定位二维数组元素,直接操作元素值而非地址。
  2. 修正函数传参:二维数组名会隐式转换为指向第一个元素的int*指针,直接传递数组名arrA、arrB、arrC即可,无需取越界地址。
  3. 修正减法逻辑:直接让arrA和arrB对应位置的元素值相减,赋值给arrC的对应元素。

修正后的完整代码

#include <stdio.h>

int *readMatrix(int *arr)
{
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            printf("row %d, col %d: ", i + 1, j + 1);
            scanf("%d", &arr[i * 4 + j]);
        }
    }
    printf("\n");
    return arr;
}

int *subM(int *arrA, int*arrB, int *arrC){
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            // 用一维下标计算元素位置,直接操作值
            arrC[i * 4 + j] = arrA[i * 4 + j] - arrB[i * 4 + j];
        }
    }
    return arrC;
}

int main()
{
    int arrA[3][4];
    int arrB[3][4];
    int arrC[3][4];

    // 直接传递数组名,隐式转换为int*指针
    readMatrix(arrA);
    readMatrix(arrB);
    subM(arrA, arrB, arrC);

    // 可选:打印结果验证
    printf("Subtraction result:\n");
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            printf("%d ", arrC[i][j]);
        }
        printf("\n");
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者anono

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:45:32