将指针(矩阵)传递给c

时间:2016-07-17 15:23:56

标签: c pointers matrix dynamic-arrays dynamic-allocation

我以通常的方式使用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)

或者是因为我使用了无效功能? 感谢您的关注!

1 个答案:

答案 0 :(得分:0)

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

方法是什么

void stampmatrix(int **matrix, int dim)

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

所以是的,你通过值指示传递给矩阵 - 你给了一个人一份你的苹果路标图。

你做的另一件事是matrix[r][c]隐式取消引用指针 - 或者,该方法是指在此网格中遵循苹果路标 - 地图方向一直指向(r,c)。 / p>

所以当你说'matrix [r] [c] = 1&#39;时,你要说的是确保当你离开时,(r,c)只有一个苹果。这就是为什么矩阵[r] [c]的值发生了变化。