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

15x15方阵乘法报错:Expression must have arithmetic type问题排查

二维矩阵乘法:错误分析与修正

错误原因:指针操作的类型错误

你遇到的「Expression must have arithmetic type」错误,根源在于*(A + k)和*(B + k)的类型问题:

  • 二维数组A的本质是指向一维数组的指针,类型为int (*)[15]。A + k指向的是矩阵A的第k行,解引用*(A + k)后得到的是一个一维数组(类型int[15])。
  • C语言里数组不能直接参与乘法这类算术运算,编译器会报错“表达式必须是算术类型”,因为数组属于聚合类型,不支持直接算术操作。

额外问题:矩阵乘法的逻辑错误

除了指针问题,你的循环逻辑也完全不符合矩阵乘法规则:

  1. 矩阵乘法中,C[i][j]是A的第i行和B的第j列对应元素相乘的累加和,公式应为C[i][j] += A[i][k] * B[k][j](k从0到14)。
  2. 你写的k < 14加上循环内手动k++,会让k每次增加2,只遍历了一半元素,计算结果完全错误。

修正后的代码(下标版,新手友好)

用数组下标访问元素更直观,避免指针操作的误区,同时修正循环逻辑:

#include <stdio.h>
#define N 15
#define _CRT_SECURE_NO_WARNINGS

int main() {
    int A[N][N];
    int B[N][N];
    int C[N][N];
    
    printf("Input matrix A.\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("Enter your element:\n");
            scanf_s("%d", &A[i][j]);
        }
        printf("\n");
    }

    printf("Input matrix B.\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("Enter your element:\n");
            scanf_s("%d", &B[i][j]);
        }
        printf("\n");
    }
    
    printf("Matrix A.\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d\t", A[i][j]);
        }
        printf("\n");
    }

    printf("Matrix B.\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d\t", B[i][j]);
        }
        printf("\n");
    }

    // 修正后的矩阵乘法核心逻辑
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            C[i][j] = 0;
            // k遍历所有列/行,不要手动自增k
            for (int k = 0; k < N; k++) {
                // 正确的元素对应关系:A的第i行第k列 × B的第k行第j列
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }

    printf("Your result:\n");
    printf("Matrix C.\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d\t", C[i][j]);
        }
        printf("\n");
    }
    return 0;
}

指针版实现(可选练习)

如果想尝试用指针操作实现,正确的写法需要逐层解引用二维数组的指针:

// 替换核心乘法逻辑部分
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        C[i][j] = 0;
        for (int k = 0; k < N; k++) {
            // *(A + i) 指向A的第i行,再 +k 指向该行第k个元素
            // *(B + k) 指向B的第k行,再 +j 指向该行第j个元素
            C[i][j] += *(*(A + i) + k) * *(*(B + k) + j);
        }
    }
}

这里*(*(A + i) + k)等价于A[i][k],*(*(B + k) + j)等价于B[k][j],本质是用指针模拟下标访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:35:18