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语言里数组不能直接参与乘法这类算术运算,编译器会报错“表达式必须是算术类型”,因为数组属于聚合类型,不支持直接算术操作。
额外问题:矩阵乘法的逻辑错误
除了指针问题,你的循环逻辑也完全不符合矩阵乘法规则:
- 矩阵乘法中,
C[i][j]是A的第i行和B的第j列对应元素相乘的累加和,公式应为C[i][j] += A[i][k] * B[k][j](k从0到14)。 - 你写的
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
相关产品推荐
相关产品推荐

