gpt4 book ai didi

c - 将指针(矩阵)传递给c中的函数

转载 作者:行者123 更新时间:2023-11-30 20:35:40 25 4
gpt4 key购买 nike

我以通常的方式使用 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 函数?感谢您的关注!

最佳答案

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

什么方法

void stampmatrix(int **matrix, int dim)

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

所以,是的,您通过值方向传递到矩阵 - 您给了一个人您的苹果路标 map 的副本。

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

因此,当您说“matrix[r][c] = 1”时,您是在说确保离开时 (r, c) 处只有一个苹果。这就是矩阵[r][c]处的值发生变化的原因。

关于c - 将指针(矩阵)传递给c中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38422813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com