将数组传递给函数时,不需要写下标。
这意味着,而不是这个:
readMatrix(&arrA[3][4]);
只需这样写:
readMatrix(arrA);
您也可以(实际上,应该)删除指针运算符 (&),因为当仅使用数组名称时,它会自动充当指针。
现在让我们看一下 readMatrix 的定义。
int *readMatrix(int *arr)
对多维数组使用指针是可以的,但是编译器会吐出很多警告。
最标准的方法是在函数定义中使用下标:
int *readMatrixStandard(int arr[3][4])
{
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][j]);
}
}
printf("
");
return arr;
}
- subM中的下标
对于您的情况,有两种方法可以访问多维数组。
要么告诉编译器这个函数接受一个多维数组:
而不是这个:
int *subM(int *arrA, int*arrB, int *arrC)...
做这个:
int *subM(int arrA[3][4], int arrB[3][4], int arrC[3][4])...
代码看起来像这样:
int *subMMultiDimension(int arrA[3][4], int arrB[3][4], int arrC[3][4]){
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]; //code where I am getting error
printf("%5d", arrC[i][j]);
}
puts(""); // for newline
}
return arrC;
}
或者使用一些 C/C++ 独有的指针魔术 :)(不要与上面的解决方案结合使用)
而不是这个:
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]; //code where I am getting error
}
}
return arrC;
}
尝试这个:
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 * 4 + j] = arrA[i * 4 + j] - arrB[i * 4 + j]; //code where I am getting error
}
}
return arrC;
}
使用其中一种方法,但第一种似乎更标准,因为编译器不会对第一种发出警告。
- 返回值
你可能知道这是怎么回事。我现在只是在敲代码。
代替:
return arr;
return arrC;
我更喜欢这个以减少警告:
return arr[0];
return arrC[0];
原因很简单。它实际上指向相同的地址,但它让编译器闭嘴。
我认为就是这样。最终代码如下所示:
#include <stdio.h>
int * readMatrixStandard(int arr[3][4])
{
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][j]);
}
}
printf("
");
return arr[0];
}
int * subMMultiDimension(int arrA[3][4], int arrB[3][4], int arrC[3][4])
{
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]; //code where I am getting error
printf("%5d", arrC[i][j]);
}
puts(""); // for newline
}
return arrC[0];
}
int main(void) // I recommend to always write void here if you are not using
// an old compiler
{
int arrA[3][4];
int arrB[3][4];
int arrC[3][4];
readMatrixStandard(arrA);
readMatrixStandard(arrB);
subMMultiDimension(arrA,arrB,arrC);
return 0;
}
编译很好,没有警告。
这些代码 sn-ps 只是我的建议。如果你想知道用 C 做某事的最标准方法,你可能需要查找它。还推荐一本好书。例如,我通过 Stephen Prata 的 C Primer Plus 学习了 C。一本很棒的书,有很多例子和插图,可以帮助你了解情况。
再次为我的英语感到抱歉。估计还有很长的路要走。
如果我遗漏了什么或在某处犯了错误,请告诉我。
编辑:是 Stephen Prata,不是 Stephan ;)