关于将指向数组的指针作为函数形参的混淆

Confusion about pointer to an array as a function parameter

本文关键字:函数 形参 指针 数组      更新时间:2023-10-16

在我的关于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;

    }

在main中调用append时,"aArr"前面的"&"符号是否表示传递了aArr的地址,或者传递了对aArr的引用?

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

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

作者是否在append方法中放错了"&"符号的顺序(它应该在"bArr"前面)?

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

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

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个整数数组传递,而在第二种情况下,它作为4个整数数组的地址传递。

从英语中你可以看出这是两种完全不同的东西。

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

#include <stdio.h>
int *append(int (*foo)[4], int secondArray[3] )
{
    int *foo1 = *foo;
    for (int i = 0; i < 4; ++i)
    {
        printf("foo: %dn", foo1[i]);
    }
    for (int j = 0; j < 3; ++j)
    {
        printf("secondArray: %dn", 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