【问题标题】:C - float** function parameter not passing valuesC - float** 函数参数不传递值
【发布时间】:2019-03-17 23:48:20
【问题描述】:

我将一个矩阵作为浮点**指针传递给一个函数,这个函数唯一做的就是打印指针指向的矩阵中的元素。但是,print 语句中的元素都是 0。我怀疑我已经正确初始化了指针 xadjm。

#include <stdio.h>
#include <stdlib.h>

void which(float **adj_mat, int n) {
  for (int tt=0; tt<n; tt++) {
    for (int cc=0; cc<n; cc++) {
      if (cc==(n-1)) {
        printf("%f-\n", *(adj_mat+tt*n+cc));
      } else {
        printf("%f-", *(adj_mat+tt*n+cc));
      }
    }
  }
}


int main() {
  int n=5;
  float adjm[5][5] = {{0.0, 1.0, 1.0, 0.0, 0.0}, {1.0, 0.0, 0.0, 1.0, 0.0}, {1.0, 0.0, 0.0, 1.0, 0.0}, {0.0, 1.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0, 0.0}};
  float **xadjm = (float**) adjm;
  which(xadjm, n);

  return(0);
}

执行代码的输出:

0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-

【问题讨论】:

标签: c pointers initialization parameter-passing


【解决方案1】:

您正在执行无效的强制转换。

您正在尝试将 float[5][5] 转换为 float **。虽然数组确实衰减到指向其第一个元素的指针,但 only 适用于最外层的数组维度。它适用于内部尺寸。

你可以做的是将参数列表中数组的维度指定为which

void which(int n, float adj_mat[n][n]) {

那么你可以这样称呼它:

which(n, adjm);

您也打印不正确:

  if (cc==(n-1)) {
    printf("%f-\n", *(adj_mat+tt*n+cc));
  } else {
    printf("%f-", *(adj_mat+tt*n+cc));
  }

表达式*(adj_mat+tt*n+cc) 为您提供float *,而不是float。而是执行以下操作:

  if (cc==(n-1)) {
    printf("%f-\n", adj_mat[tt][cc]);
  } else {
    printf("%f-", adj_mat[tt][cc]);
  }

【讨论】:

  • 我会说您的方法并不理想,因为我不想将矩阵作为参数传递给函数。想象一下,如果矩阵大很多。我在这篇文章中使用了宠物示例大小,但实际上,我的矩阵会大得多。在信息的内存块所在的函数之间进行通信时,我想使用指针。
  • 您实际上并没有将完整的矩阵作为参数传递。每当您将数组(无论有多少维)传递给函数时,您都会将指针传递给第一个成员。所以int *int [] 作为参数是相同的。在您的情况下,float[n][n]float (*)[n] 相同。所以实际上你只是传递一个指针。
  • 这是真的吗?这似乎具有欺骗性,因为如果您传递一个声明为 float arg[n][n] 的 arg,那么您正在发送该内存块?你能给我一个参考,这样我就可以验证了。您的代码确实有效,所以我将给您投票。只是想确保我最终决定做的是最聪明的整体。
  • @areyoujokingme C standard,第 6.7.6.3p7 节:将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符 (如果有)是在数组类型派生的 [ 和 ] 中指定的那些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多