为什么编译器在不传递数组元素地址时不会引发错误?
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::
明确限定名称。)
我有以下代码
# 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::
明确限定名称。)