C++ 在使用数组元素时是否应该引用它们?
假设我们希望使用以下代码实现冒泡排序:C++ 在使用数组元素时是否应该引用它们?,c++,arrays,pointers,swap,C++,Arrays,Pointers,Swap,假设我们希望使用以下代码实现冒泡排序: void bubbleSort(int-arr[],int-n){ 对于(int i=0;i模板无效掉期(T&a,T&b); 这是std::swap()的定义 如您所见,它获取元素的地址 资料来源: 交换函数中是否应该在arr[i]和arr[j]之前有一个&before 取决于swap接受的参数类型 如果您询问C++的代码> STD::Cuffs,那么:不,不应该有操作符和./P> 那会有什么不同呢 一元运算符&运算符是运算符的addressof。结果是指
void bubbleSort(int-arr[],int-n){
对于(int i=0;i模板无效掉期(T&a,T&b);
这是std::swap()的定义
如您所见,它获取元素的地址
资料来源:
交换函数中是否应该在arr[i]和arr[j]之前有一个&before
取决于swap
接受的参数类型
如果您询问C++的代码> STD::Cuffs<代码>,那么:不,不应该有操作符和./P>
那会有什么不同呢
一元运算符&运算符是运算符的addressof。结果是指向操作数的prvalue指针
std::swap
的参数是对非常量的引用,因此不能绑定到右值参数。此外,这将是交换指针,而不是元素的值
您可以执行std::iter_swap(&arr[i],&arr[j])
因为std::iter_swap
通过参数迭代器间接地交换指向的对象……但这将是不必要的复杂。我不建议在这种情况下使用它
或者,std::iter\u交换(arr+i,arr+j)
也可以工作
一些例子:
// similar to std::swap
void swap1(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
swap1(arr[i], arr[j]);
// similar to std::iter_swap
void swap2(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
swap2(arr + i, arr + j);
swap2(&arr[i], &arr[j]);
函数std::swap
具有引用类型的参数
swap(arr[i], arr[j]);
swap( x, y );
swap( &x, &y );
交换被引用对象arr[i]
和arr[j]
如果你写得像
swap(&arr[i], &arr[j]);
然后,编译器将发出一个错误,因为您正在传递右值,并且不能用左值引用绑定右值
您可以编写自己的swap
函数,该函数在C中通过引用接受参数,这意味着对象通过指向它们的指针间接传递给函数
这是一个演示程序
#include <iostream>
#include <utility>
using namespace std;
void swap( int *px, int *py )
{
int tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int x = 5, y = 10;
cout << "x = " << x << ", y = " << y << '\n';
swap( x, y );
cout << "x = " << x << ", y = " << y << '\n';
swap( &x, &y );
cout << "x = " << x << ", y = " << y << '\n';
return 0;
}
在这个电话里
swap(arr[i], arr[j]);
swap( x, y );
swap( &x, &y );
这里使用重载的标准函数std::swap
,因为它的参数是左值
在这个电话里
swap(arr[i], arr[j]);
swap( x, y );
swap( &x, &y );
这里称为重载的用户定义函数swap
,因为它的参数是右值(临时对象)编译器会选择最合适的用户定义函数。该函数已通过引用获取其参数。type\u name&variable\u name
进行引用。variable\u name
进行指针(大多数情况下)。虽然数组本身可以衰减为指向其第一个元素的指针,但数组元素不会自动转换为指针。数组中的int
与任何其他int
之间没有区别。请注意,运算符&
的一元“地址”与“引用”完全无关在C++中,通常,在C++中,函数是否按值或引用引用其参数是函数的属性以及它如何声明其参数。不必告诉调用站点如何传递参数。在C中,因为引用类型不存在,实现指针传递的唯一方法是指针。在这种情况下,您需要使用<代码>和代码>来获取调用站点的参数的地址。这有时在C++中仍然会发生,但是IR应该是例外。抱歉,但是您没有澄清OPS对引用与指针的混淆,但有助于它。谢谢您的详细解答。