将指针(矩阵)传递给c中的函数[重复]

Posted

技术标签:

【中文标题】将指针(矩阵)传递给c中的函数[重复]【英文标题】:Passing pointers (matrix) to a function in c [duplicate] 【发布时间】:2016-11-20 05:45:54 【问题描述】:

我以通常的方式使用 calloc 动态创建了一个矩阵:

int **matrix;
int dim,r;
scanf("%d",&dim);
matrix=(int **)calloc(dim, sizeof(int *));
for(r=0; r<dim; r++)
   
    matrix[r]=(int *)calloc(dim, sizeof(int));
   

现在如果我想创建一个函数来打印这个矩阵的元素,我应该写这样的东西:

void stampmatrix(int **matrix, int dim)

int r=0, c=0;
for(r=0; r<dim; r++)
    
    printf("(");
    for(c=0;c<dim;c++)
        
        printf(" %d , ",matrix[r][c]);
        
    printf(")");
     

这很好用。 现在我将这一行添加到上一个函数中

`...`
 matrix[r][c]=1;
 printf(" %d , ",matrix[r][c]);
 ...

如果我在我的主函数中调用这个函数, 戳矩阵(矩阵,暗淡) 一旦我运行程序,编译器应该创建我的矩阵的副本,用 1 填充它,然后打印它们,然后返回到我的主函数不更改实际矩阵。但是,如果我这样做,然后我在我的主函数中检查我的矩阵元素的值,它们将更改为 1。 在课堂上我被告知如果我将值传递给函数,程序会创建值的副本,使用它们然后取消副本,所以我需要将地址传递给函数以便实际更改我的内容我的主要功能中的变量。 为什么在这种情况下它不起作用,并改变了我的矩阵值?这是因为我仍然将指针传递给函数 stampmatrix?我真的不明白。函数不应该是这样的:

void stampfunction(int dim, int ***matrix)

还是因为我使用了 void 函数? 感谢关注!

【问题讨论】:

编译器复制的是矩阵的指针,而不是矩阵本身。您需要自己手动复制一份,包括内存分配。 没有矩阵/aka 2D 数组(如图所示,指针不是数组。使用正确的方法使事情变得更简单。 【参考方案1】:

请记住,在这个程序中(我假设),所有代码共享同一个堆(内存),并且指针有点像路标,指向那个堆。

什么方法

void stampmatrix(int **matrix, int dim)

就像你给一个人一个数字 dim 和物理映射到,比如说,网格中所有苹果的路标。

是的,您通过值 directions 将值传递给矩阵 - 您给了一个人一份您的 apple-signpost-map 的副本。

您所做的另一件事是 matrix[r][c] 隐式取消引用指针 - 或者,该方法表示要遵循 apple-signpost-map 的方向一直到此网格中的点 (r, c)。

所以当你说 `matrix[r][c] = 1' 时,你的意思是在你离开时确保 (r, c) 处只有一个苹果。这就是 matrix[r][c] 的值发生变化的原因。

【讨论】:

以上是关于将指针(矩阵)传递给c中的函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将指针向量传递给c ++中的函数[重复]

如何通过c中的指针传递二维数组[重复]

将指针传递给函数并更改它指向的地址[重复]

如何将指针分配给函数中的新对象,而该对象在退出后不会消失[重复]

将参数作为接口传递[重复]

用指针传递引用和值[重复]