如何使用函数参数中的int指针来获取2d数组中最大值的索引并返回指针

How can I use the int pointers in the parameter of the function to get the indices of the largest value in the 2d array and return the pointer?

本文关键字:指针 最大值 数组 索引 返回 2d 获取 何使用 函数 int 参数      更新时间:2023-10-16
double * matrix_max_1(double mat[][COL], int r, int* pi, int* pj) {
double * ptrmat = 0;
double max = 0;

for (pi = 0; *pi <= ROW; pi++)
for (pj = 0; *pj <= COL; pj++) {
if (mat[*pi][*pj] > *ptrmat) {
ptrmat = &mat[*pi][*pj];


}

}
return ptrmat;
}

函数中的int r参数应该用作行数,但我已经定义了一个常量ROW。此函数的主要用途是返回指向2d数组中最大元素的指针。当我以当前形式运行它时,程序会崩溃。

您对索引的使用完全是伪造的:

for (pi = 0; *pi <= ROW; pi++)

pi是一个设置为0的指针,然后用*pi<=取消引用它行?pj也是如此。。。还有*pj和*pi是什么意思?

使用这样的索引:

double* currentMax = &mat[0][0];
for (size_t i = 0; i < ROW; i++)
for (size_t j = 0; j < COL; j++) {
if (mat[i][j] > *currentMax) {...

这有很多问题。

double * ptrmat = 0;

不是一个很好的价值开始;每次你想取消引用它时,都需要将它与空指针进行比较。

double max = 0;

也不是一个很好的起始值-如果所有元素都是负数怎么办?

for (pi = 0; *pi <= ROW; pi++)

是胡说八道
pi是指向应该存储结果的位置的指针
在这里,你用空指针覆盖它,然后立即取消对它的引用。
增加pi也没有任何意义
(即使你修复了这个问题,*pi = 0(*pi)++,你也会无条件地覆盖*pi,不是存储最大值的索引,而是存储循环终止的索引。)

此外,最大有效索引是r - 1,而不是ROW
下一个循环的最大有效索引是COL - 1,而不是COL

if (mat[*pi][*pj] > *ptrmat)

如果您修复了其他错误,这将失败,因为ptrmat是第一次迭代中的空指针。

相反,

  • 假设第一个矩阵元素是最大值
  • 循环使用局部变量,并且只有在知道答案时才将它们的值存储在"out"参数中

类似这样的东西:

double* matrix_max_1(double matrix[][COL], int rows, int* row, int* column) {
int max_row = 0;
int max_column = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < COL; j++) {
if (matrix[i][j] > matrix[max_row][max_column]) {
max_row = i;
max_column = j
}
}
}
if (row != nullptr) {
*row = max_row;
}
if (column != nullptr) {
*column = max_column
}
return &matrix[max_row][max_column];
}