【问题标题】:Trying to pass a matrix by reference [duplicate]试图通过引用传递矩阵[重复]
【发布时间】:2016-09-15 21:38:33
【问题描述】:

对不起,我是 c 新手,我正在尝试通过引用将此矩阵传递给过程 所以我不必将它复制到内存中。我找不到任何解释。这是我能得到的最接近的,但它不起作用。 该程序的重​​点仅在于它,我做了它来测试它。

#include <stdio.h>

typedef int tmatrix[5][5];

void print (tmatrix*mtr)
{

    int l , m;  

    l=0;

    while (l<=4)

    {
        m=0;

        while (m<=4)
        {
            printf("%d", *mtr[l][m]);

            m = m+1;
        }

        printf("\n");

        l=l+1;

    }
}
//-----------------------------------
int main()
{
int i , j;

tmatrix matrix;


i=0;

while (i <= 4)
{

    j=0;

    while (j<=4)
    {

        matrix[i][j] = 3;

        j = j+1;

    }

    i = i+1;

}

print(&matrix);

return 0;

}

应该打印出来:

33333
33333
33333
33333
33333

但它会打印:

33333
54198992041990930
1977890592-1961670060002752492
03232520
664-21479789407743168

我知道这可能与指针有关,因为我认为这些是地址,但我没有任何线索。

【问题讨论】:

  • 表达式 *mtr[l][m] 并没有像你想象的那样做,因为 operator precedence
  • 您还必须记住,数组自然会衰减为指向其第一个元素的指针,因此无需通过引用传递数组(或者更确切地说 emulate 通过引用传递,因为 C没有)。
  • 非常感谢你们,我已经坚持了好几个小时了。

标签: c


【解决方案1】:
  1. 矩阵是一个二维整数数组。您可以直接将其传递给函数。传递数组与通过引用传递是一样的。
  2. 函数内部的printf也将改为直接访问。 *mtr[l][m] --&gt; mtr[l][m]
  3. 调用的时候可以直接调用,如图。 print(&amp;matrix) --&gt; print(matrix)

修改后的代码如下。

#include <stdio.h>

typedef int tmatrix[5][5];

void print (tmatrix mtr)
{

    int l , m;  

    l=0;

    while (l<=4)

    {
        m=0;

        while (m<=4)
        {
            printf("%d", mtr[l][m]);

            m = m+1;
        }

        printf("\n");

        l=l+1;

    }
}
//-----------------------------------
int main()
{
int i , j;

tmatrix matrix;


i=0;

while (i <= 4)
{

    j=0;

    while (j<=4)
    {

        matrix[i][j] = 3;

        j = j+1;

    }

    i = i+1;

}

print(matrix);

return 0;

}

【讨论】:

  • 非常感谢瑞诗凯诗 Raje。但是我能问你吗,如果我想通过值传递呢?
  • @NicoBaldelli 在 C 中,数组总是通过引用传递。你不能按值传递它。
  • @RishikeshRaje,错了,在C中都是按值传递的,但是数组衰减成指针
  • 所以,实际上,您不能按值传递数组,对吧?
  • 不是直接的,唯一的方法是将数组嵌入到struct 并传递一个指向这个struct 的指针
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2014-10-29
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多