C ++ - 访问动态数组中的值

时间:2013-11-20 13:10:03

标签: c++ arrays

我的作业需要以下内容:

- 对行和列进行命令行输入,并动态创建一个用随机数填充的二维数组

创建一个名为find_greatest_product的函数,以找到四个相邻的最大乘积 数组中的数字。四个相邻的数字可以是形状的任何配置 发现在游戏中的俄罗斯方块中。您的功能需要从最初的产品返回 使用结构的四个数字的位置,形状和方向。

是的,这是一个完全没用的程序,纯粹是为了练习2-D阵列。

我已经设置了阵列,所以我开始使用最简单的形状:盒子。但是,当我尝试访问充满随机数的数组时,产品和因子似乎都为0.任何提示为什么我无法访问随机数组中的整数来查找产品?相关的代码位如下。您可以假设此处未复制的所有功能都可以正常工作。

struct shape {
    int highest;
    int factors[4];
    int startRow;
    int startColumn;
} tShape, sShape, iShape, boxShape;


int main(int argc, char* argv[]) {

    if(argc == 5) {
            for(int i = 1; i < argc; i++) {
            rows = getArg(argc, argv, i, compare1);
            }
            for(int i = 1; i < argc; i++) {
            columns = getArg(argc, argv, i, compare2);
            }
    }

    int ** array = new int*[rows];

    int i, j;
    for (i = 0; i < rows; i++) {
            array[i] = new int[columns];
    }

    create_array(array, rows, columns);

    for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                    cout << array[i][j];
                    cout << " ";
            }
    cout << endl;
    }

    boxProduct(array, rows, columns, boxShape);

    cout << boxShape.highest << endl;

    for (int i = 0; i < 4; i++) {
            cout << boxShape.factors[i];
            cout << " ";
    }
    cout << endl;

    return 0;
}

void boxProduct(int *array[], int rows, int columns, shape boxShape) {

    int highest = 0;
    int product = 0;

    for (int i = 0; i < rows - 1; i++) {
            for (int j = 0; j < columns - 1; j++) {
                    product = (array[i][j]*array[i][j+1]*array[i+1][j]*array[i+1][j+1]);
                    if (product > highest) {
                            boxShape.highest = product;
                            boxShape.factors[0] = array[i][j];
                            boxShape.factors[1] = array[i][j+1];
                            boxShape.factors[2] = array[i+1][j];
                            boxShape.factors[3] = array[i+1][j+1];
                    }
            }
    }
}

以下是带有10行×5列矩阵的示例输出:

27 86 4 41 44
17 6 5 40 32
42 58 14 95 53
8 28 95 27 91
63 22 27 49 2
38 37 39 37 76
9 17 14 13 10
10 30 16 67 22
49 10 33 63 5
86 71 86 34 50
0 <- product
0 0 0 0 <- the four factors

1 个答案:

答案 0 :(得分:1)

默认情况下,C和C ++函数按值调用,而不是按引用调用。也就是说,编译器会创建赋予函数的参数副本,如果函数修改了它的参数,它会修改副本。

考虑这个例子:

void foo( int x )
{
    x++;  // increments foo's own local copy of 'x'
}

int main()
{
    i = 42;
    cout << i << endl;   // prints 42
    foo(i);
    cout << i << endl;   // ALSO prints 42!

    return 0;
}

这将打印42次,因为foo修改了副本。

如果稍微修改代码,则告诉C ++编译器通过引用传递参数。 (注意:这是一个仅限C ++的功能;它在C中不起作用。)现在,对函数内部参数的任何修改都将修改调用者看到的值:

void foo( int& x )  // The & means "pass this parameter by reference"
{
    x++;
}

int main()
{
    i = 42;
    cout << i << endl;  // prints 42
    foo(i);
    cout << i << endl;  // prints 43

    return 0;
}

修改调用者持有的值的另一种方法是传递指向该值的指针,而不是值本身。这仍然是按值调用,但在这种情况下,传递函数的值是指针。例如:

void foo( int* x )  // x is now a pointer to integer
{
    (*x)++;  // The (*x) dereferences the pointer.  What happens if you leave off the parens?
}

int main()
{
    i = 42;
    cout << i << endl;  // prints 42
    foo(&i);            // the & there takes the address of 'i' and passes that to foo()
    cout << i << endl;  // prints 43

    return 0;
}

因为C不支持 call-by-reference 参数,所以它需要最后一个方案。一些C ++代码也以这种方式使用指针。现代C ++风格倾向于尽可能避免使用裸指针,但您仍会不时地看到指针。

Punchline:您需要将此知识应用于上述shape boxShape结构。您要么通过引用传递shape boxShape,要么将指针传递给shape boxShape。两者都是有效的方法,尽管C ++更倾向于传递引用。