将数组作为值/指针发送的C ++差异

时间:2013-05-05 21:41:32

标签: c++ arrays pointers arguments

所以我以某种方式让这个工作,我真的很感兴趣为什么我的第一次尝试失败。

我有C的非正式经验,现在我正在尝试学习C ++。我想我会尝试一些常见的命令,比如将参数传递给函数,但在尝试访问传递的数组的内容时收到“不完整的类型错误”。

这是错误的代码:

    void printoutarray(int array[][], int height, int width){
        for (int x = 0; x < width; x++){
            for (int y = 0; y < height; y++){
                cout << array[x][y]) << " ";
            }
            cout<<"\n";
        }
    }

我能够使用指针修复代码:

    void printoutarray(int *array, int height, int width){
        for (int x = 0; x < width; x++){
            for (int y = 0; y < height; y++){
                cout << *(array+x*width+y) << " ";
            }
            cout<<"\n";
        }
    }

并像这样传递数组:

    #define hght 5
    #define wdth 5
    /*Other code/main function*/
    int inputarray[hght][wdth] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
    printoutarray(*inputarray, hght, wdth);

但我的问题是为什么我必须专门发送函数指针的数组。数组变量不应该是指针本身吗?另外,为什么我需要在我的“固定”代码中包含dereference运算符,是因为我发送一个指针指针?我再次对这种语言的运作感到好奇,所以任何见解都会非常感激,谢谢!

2 个答案:

答案 0 :(得分:3)

传递给函数时,数组被转换为指针(在C和C ++中为true)。你的错误似乎在于认为因为这个,当传递给函数时,2D数组应该被转换为双指针,这不是真的。

你有一个2D数组

int inputarray[hght][wdth] = ...;

查看此方法的一种方法是它是一个大小为hght的数组,此数组的每个元素都是另一个大小为wdth的数组。因此,在将此数组转换为指针时,您将获得指向大小为wdth的数组的指针。喜欢这个

void printoutarray(int array[][wdth], int height, int width){

或更明确地像这样

void printoutarray(int (*array)[wdth], int height, int width){

使用这些轻微更改中的任何一个都可以使用原始代码。虽然在这两种情况下width参数都没用,因为此函数仅适用于宽度为wdth的数组

这里没有任何事情在C中也不会完全相同。

答案 1 :(得分:0)

除了Syntactial / typos之外,这两个函数之间没有本质区别。 “按值传递”根本不传递值,就像C一样,它传递指向第一个元素的指针。如果您给出的两个函数的编译器输出以任何有意义的方式不同,我会感到非常惊讶。