关于指向数组的指针作为函数参数的困惑

时间:2016-10-01 22:02:31

标签: c++ arrays pointers

在我关于c ++的教科书中,我有以下代码示例:

  using std::cout;
    using std::endl;
    int main() {
        int aArr[4] = { 3,4,2,3 };
        int bArr[3] = { 2,3,1 };

        cout << "Append: " << endl;
        printArray(aArr, 4); cout << " + "; printArray(bArr, 3);
        int* cArr = append(&aArr, bArr);
        cout << " = "; printArray(cArr, 7); cout << endl;
        return 0;


    }

“&amp;”在main中追加调用中“aArr”前面的符号表示传递aArr的地址,或者传递对aArr的引用。

然后问题要求我实现一个函数append,它接受两个数组:第一个数组(在第一个参数中),大小为4,数组指针,第二个数组(在第二个参数中),大小为3,引用和返回一个指向大小为7的数组的指针。我已将该函数声明为(在相应的头文件中)

int* append( int foo[4], int (&secondArray) [3] );

作者是否可能错放了“&amp;”的顺序append方法中的符号(它应该在“bArr”之前)?

1 个答案:

答案 0 :(得分:1)

编译器可以在这种情况下帮助你。

让我们假设这是你的追加函数的函数原型:

int* append( int foo[4], int (&secondArray) [3]);

我可以用这么简单的代码测试一下:

int* append( int foo[4], int (&secondArray) [3])
{
    return 0;
}

int main() {
    int aArr[4] = { 3,4,2,3 };
    int bArr[3] = { 2,3,1 };
    int* cArr = append(&aArr, bArr);
    return 0;
}

但是编译器并不喜欢这样,失败了这个错误:

test.cpp(9): error C2664: 'int *append(int [],int (&)[3])': 
          cannot convert argument 1 from 'int (*)[4]' to 'int []'

正如您所看到的那样,它不像第9行的&aArr参数1,因为它与第1行的函数定义的参数1不匹配。从错误消息中它甚至足够好说明为什么它认为自己不排队。

现在使用编译器中的提示很明显该函数应该看起来像这样:

int *append(int (*foo)[4], int secondArray[3])
{
    return 0;
}

int main() {
    int aArr[4] = { 3,4,2,3 };
    int bArr[3] = { 2,3,1 };
    int* cArr = append(&aArr, bArr);
    return 0;
}

通过这种更改,编译器很乐意接受正确的代码。

现在比较两者你可以看到区别在于第一种情况,第一个参数作为4个整数的数组传递,而在第二种情况下,它作为四个整数数组的地址传递。

从英语中你可以看出这些是两个非常不同的东西。

编辑:以下是该示例的扩展,展示了如何访问函数内的数据。

#include <stdio.h>

int *append(int (*foo)[4], int secondArray[3] )
{
    int *foo1 = *foo;

    for (int i = 0; i < 4; ++i)
    {
        printf("foo: %d\n", foo1[i]);
    }
    for (int j = 0; j < 3; ++j)
    {
        printf("secondArray: %d\n", secondArray[j]);
    }
    return 0;
}

int main() {
    int aArr[4] = { 3,4,2,3 };
    int bArr[3] = { 12,13,11 };
    int* cArr = append(&aArr, bArr);
    return 0;
}

编译运行此代码会产生以下输出:

foo: 3
foo: 4
foo: 2
foo: 3
secondArray: 12
secondArray: 13
secondArray: 11