使用指针实现二维数组减法遇编译错误: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; }
错误原因
- 指针类型不匹配导致下标错误:
arrC是int*类型指针,仅支持一维下标访问。arrC[i][j]会被解析为*(arrC[i] + j),但arrC[i]是一个int值(非指针),对int值做指针偏移操作必然触发类型错误。 - 逻辑错误:操作地址而非元素值:
&arrA[i][j] - &arrB[i][j]计算的是两个地址的偏移量(单位为int的字节数),不是数组元素的差值。同时,&arrC[i][j]是地址常量,无法被赋值,这本身就是非法操作。 - 传参越界:
&arrA[3][4]是二维数组的越界地址,arrA的有效范围是arrA[0][0]到arrA[2][3],传递该地址会导致函数访问非法内存。
解决方法
- 用一维下标定位元素:对于
int*类型指针,通过i*列数 + j的方式定位二维数组元素,直接操作元素值而非地址。 - 修正函数传参:二维数组名会隐式转换为指向第一个元素的
int*指针,直接传递数组名arrA、arrB、arrC即可,无需取越界地址。 - 修正减法逻辑:直接让
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
相关产品推荐
相关产品推荐

