在函数中传递2d数组:接收的2d数组是指针数组

时间:2015-02-01 19:51:02

标签: c++ arrays

我有一个巨大的2d数组,我试图传递给一个函数。这是阵列:

int image[13][13] =
{
    { 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72 },
    { 72, 72, 71, 70, 70, 70, 70, 70, 70, 70, 70, 72, 72 },
    { 72, 107, 116, 145, 137, 130, 154, 118, 165, 111, 173, 116, 72 },
    { 72, 126, 150, 178, 158, 175, 163, 169, 170, 160, 176, 163, 70 },
    { 72, 130, 192, 195, 197, 186, 129, 185, 196, 196, 193, 195, 70 },
    { 72, 126, 187, 166, 85, 75, 106, 185, 191, 191, 189, 188, 69 },
    { 72, 121, 183, 111, 100, 51, 137, 188, 187, 186, 184, 180, 69 },
    { 72, 117, 177, 143, 58, 77, 137, 180, 171, 183, 178, 173, 69 },
    { 72, 111, 172, 108, 101, 110, 115, 67, 49, 120, 175, 165, 68 },
    { 72, 107, 145, 105, 145, 120, 85, 51, 51, 56, 138, 157, 68 },
    { 72, 103, 147, 158, 155, 131, 115, 114, 114, 115, 121, 152, 68 },
    { 72, 79, 146, 161, 163, 165, 168, 167, 164, 162, 158, 114, 70 },
    { 72, 69, 53, 49, 49, 49, 49, 49, 49, 49, 50, 61, 72 }
};

我将此函数声明为:

int max_2d(int p_valeurs[13][13]);

int max_2d(int p_valeurs[13][13])
{
    int valeur_max;

    for (int i = 0; i < 13; i++)
    {
        int max_local = max(p_valeurs[i], LARGEUR);

        if (valeur_max < max_local)
        {
            valeur_max = max_local;
        }
    }
    return valeur_max;
}

int max(int p_valeurs[]);

int max(int p_valeurs[], int p_taille)
{
    int valeur_max;

    for (int i = 0; i < p_taille; i++)
    {
        if (valeur_max > p_valeurs[i])
        {
            valeur_max = p_valeurs[i];
        }
    }

    return valeur_max;
}

我的问题是,当我在image函数中传递max_2d 2d数组时,数组变为int(*)[13]。我不明白发生了什么,有什么不对。任何人都可以帮助我吗?

修改

请记住,这是学生的工作。我需要了解什么是错的,我该如何解决这个问题。谢谢!

2 个答案:

答案 0 :(得分:2)

我在代码中看到了几个逻辑错误:

  1. valeur_max未在这些函数中初始化:这是不允许的(您无法与未初始化的值进行比较)。

  2. 在第二个函数中,变量名为valeur_max,但比较保持最小值(如果它变大则更新valeur_max

    < / LI>

    对于C ++中的问题标题,数组在传递给函数时会隐式转换为指向第一个元素的指针。 如果你真的想按值传递数组,你需要将它包装在一个结构中(注意,通过复制只是为了找到最大值似乎是一个废话)。

    2D数组在C ++中只是一个数组数组,因此当传递给函数时,传递的值变为指向数组(行)的指针。那是int(*)[13]的意思......指向13个整数数组的指针。

    对于C ++编译器来说,这两个声明

    void foo(int x[30]);
    

    void foo(int *x);
    

    完全相同(是的,数字完全被忽略)。

    请注意,这种隐式转换(或者#34; decay&#34;正如标准所描述的那样)并不会影响元素访问,而只会影响数组的复制;例如,只在一个函数中执行2d处理的版本可以是:

    int max_2d(int p[13][13]) {
        int max_val = INT_MIN;
        for (int i=0; i<13; i++) {
            for (int j=0; j<13; j++) {
                if (max_val < p[i][j]) {
                    max_val = p[i][j];
                }
            }
        }
        return max_val;
    }
    

答案 1 :(得分:1)

这是C和C ++中的经典问题,其中数组不能通过值传递。但是,它们可以通过C ++中的引用传递:

int max_2d(int (&p_valeurs)[13][13]);

p_valuers的类型正确。但请记住,这是参考。您所做的任何更改(例如p_valuers[3][7]++;)都会反映在呼叫网站上。

(在C中,我会向类型安全解决方案传入指向数组int max_2d(int (*p_valeurs)[13][13]);的指针。)

但这对您来说不是问题,因为您没有在p_valuers函数中修改max_2d。实际上,为清晰起见,您应明确将其标记为const

int max_2d(const int (&p_valeurs)[13][13]);

最后,我说数组不能通过C或C ++中的值传递。当您尝试按值传递数组时,它将传递指向数组的第一个元素的指针。此外,当编译器在函数的参数列表中看到数组时,它会自动转换&#34;顶层&#34;数组到指针int x[13][13]int (*x)[13]。这意味着出现的函数来获取数组实际上需要一个指针。但我们可以通过多种方式阻止此行为,例如在C ++中使用引用。