为什么编译器在不传递数组元素地址时不会引发错误?

Why the compiler does not raise an error when not passing address of array element?

我有以下代码

# include <iostream>
using namespace std;

void show (int list[], int len) {
    for (int i = 0; i < len; i++) {
        cout << list[i] << " ";
    }
    cout << endl;
}

void swap (int* a, int* b) {
    cout << *a << ' ' <<  *b << endl;
    int c = *a;
    *a = *b;
    *b = c;
    cout << *a << ' ' <<  *b << endl;
}

void aFunction (int list[], int len) {
    cout << "From aFunction ";
    show(list, len);
    swap(list[0], list[1]);
    cout << "From aFunction ";
    show(list, len);
}

int main() {
    int list[] = {6, 4};
    int len = sizeof(list)/sizeof(int);
    aFunction(list, len);
    return 0;
}

当我编译 运行 时,我没有收到任何错误,我收到的输出为

From aFunction 6 4 
From aFunction 4 6

但是当我在 aFunction

中更改以下行时
swap(list[0], list[1]);

swap(&list[0], &list[1]);

它仍然编译并给我以下输出

From aFunction 6 4 
6 4
4 6
From aFunction 4 6 

这是怎么回事?我最初的想法是 swap(list[0], list[1]) 是正确的,因为数组在传递给函数时会衰减为指针,所以我们实际上是将指针传递给 swap 但是 swap 中的 cout 没有打印出来,这让我相信 swap(&list[0], &list[1]) 是正确的。如果后者是正确的,为什么编译器不会为第一个引发任何错误,为什么 swap 中的 cout 不执行?哪一个是对的?这是怎么回事?????我在 MacBook Pro 上使用 g++ weird.cpp 编译这个程序。非常感谢您的解释。

您正在调用 std::swap,而不是您自己的 swap 函数。

std::swap 接受两个任何匹配类型的引用参数。

(这就是为什么,恕我直言,using namespace std; 可能不是一个好主意。我更喜欢用 std:: 明确限定名称。)