做《C 入門》中的練習6.22,一個交換兩個指標的函式:
void swap(int*& a, int*& b) {
auto temp = a;
a = b;
b = temp;
}
int main()
{
int a = 15;
int b = 4;
int* p1 = &a;
int* p2 = &b;
cout << "p1地址。" << p1 << "; p1 value: " << *p1 << "
p2地址。" << p2 << "; p2 value: " << *p2 << endl;
swap(p1, p2)。
cout << "p1地址。" << p1 << "; p1 value: " << *p1 << "
p2地址。" << p2 << "; p2 value: " << *p2 << endl;
}
不確定它是否正確,但它如預期般作業,值和地址被交換了。我在MS Visual Studio中懸停在swap函式里面的a:
它告訴我型別是int*&,但是將temp的定義改為int*& temp = a會破壞程式:
p1 address: 004FFE00; p1 value: 15; p1 value: 15
p2地址。004FFDF4; p2 value: 4; p2 value: 4
p1地址。004FFDF4; p1 value: 4; p1 value: 4
p2地址。004FFDF4; p2 value: 4; p2 value: 4
這里的正確型別是什么?MS Visual Studio型別工具提示背后的邏輯是什么?
uj5u.com熱心網友回復:
正如評論中提到的,temp的型別是int*,而不是int*&。如果你想讓它成為一個指標的參考,你可以明確地宣告這個型別或者使用auto&。然而,無論如何,你真正想要的是int*。想一想,如果你要交換兩個int,你會怎么寫:
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
在這里,你希望temp只是一個int,因為你只是想讓它存盤a的值,所以你可以把它復制到b。沒有必要讓它成為一個參考。
至于你的另一個問題,當temp是一個參考時,會發生什么?
a= 15b= 4 。
- 呼叫
swap()。
temp參考a。
a參考b(所以temp參考b)b參考temp(所以b參考b) 。
a和b現在都參考值4 。
要看到這個動作,請在除錯模式下走完這個函式,并檢查每一步的指標地址和值。
uj5u.com熱心網友回復:
swap函式可以像這樣改變。
template<typename T>
void swap(T& a, T& b) {
auto temp = a;
a = b;
b = temp;
}
首先你的問題是什么型別的int*&。在我的函式中,你的問題也是什么型別的T&。T&的意思是參考T。所以int*&的意思是參考int*。
這就是為什么當使用int*&時,P2沒有改變。
但如果你使用auto,temp型別是int*。這就是為什么它作業得那么好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/306749.html
標籤:
上一篇:當QMainWindow被最小化時,Qt應用程式以0退出。
下一篇:C 遞回流程

