我以通常的方式使用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]);
...
如果我在主函数中调用此函数, stampmatrix(矩阵,暗淡) 一旦我运行程序,编译器应该创建我的矩阵的副本,填充1,然后打印它们,然后返回到我的主函数而不更改实际矩阵。但是,如果我这样做,然后我在我的main函数中检查我的矩阵元素的值,它们将更改为1。 在类i中被告知如果我将值传递给函数,程序会创建值的副本,使用它们然后取消副本,所以我需要将地址传递给函数以便实际更改我的内容我的main函数中的变量。 为什么在这种情况下它不起作用,并改变我的矩阵值?这是因为我仍然将指针传递给函数stampmatrix?我真的不明白。功能不应该像:
void stampfunction(int dim, int ***matrix)
或者是因为我使用了无效功能? 感谢您的关注!
答案 0 :(得分:0)
请记住,在这个程序中(我假设),所有代码共享相同的堆(内存),并且指针有点像路标,到那个堆。
方法是什么
void stampmatrix(int **matrix, int dim)
就像你给一个人一个数字dim
和物理地图,比如网格中苹果的所有路标。
所以是的,你通过值指示传递给矩阵 - 你给了一个人一份你的苹果路标图。
你做的另一件事是matrix[r][c]
隐式取消引用指针 - 或者,该方法是指在此网格中遵循苹果路标 - 地图方向一直指向(r,c)。 / p>
所以当你说'matrix [r] [c] = 1&#39;时,你要说的是确保当你离开时,(r,c)只有一个苹果。这就是为什么矩阵[r] [c]的值发生了变化。