簡單理解C++引用
標籤(空格分隔): C系列
引用是變數的別名
先來兩段珍藏已久的程式碼:
第一段
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
int main()
{
int a,b;
cin>>a>>b;
if(a<b)
swap(a,b);
cout<<a<<' '<<b<<endl;
return 0;
}
第二段
#include<iostream>
using namespace std;
void swap(int *&a,int *&b)
{
int *temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int a,b;
cin>>a>>b;
int *p=&a,*q=&b;
if(a<b)
swap(p,q);
cout<<*p<<' '<<*q<<endl;
return 0;
}
這兩段是剛開始接觸C++時自己摸索著寫的,但當時理解引用不知道什麼是引用,一個人還是費了很大的力氣,現在回過來看,簡直是,。,。通過第二段程式碼可以看出,指標和引用就是一個意思—地址。
常規使用
int a=29;
int &b=a;//(1)這句就是把a變數的地址給了b,b現在變成了a的遙控器,b指向的地址就是a的地址,&的意思就是說b就是一個引用。
int * b=& a;//(2)這句話是說b為一個指標,b同樣是指向a地址的變數,只不過是指標變數。
b=20;//(1)這裡的行為就是修改b指向的地址的變數的值。
*b=20;//(2)修改b指向的地址的變數的值。
cout<<a<<endl;//(1)輸出為20
cout<<a<<endl;//(2)輸出為20
昨天課堂上老師給出一個“奇奇怪怪的程式”
#include<iostream>
using namespace std;
int a=4;
int &fun(int x) {
a=a+x;
return a;
}
int main() {
int t=5;
cout<<fun(t)<<endl;
fun(t)=20;//先呼叫再賦值,a=20
cout<<fun(t)<<endl;//輸出25,a=25;
t=fun(t);//先呼叫,再賦值, t=30
cout<<fun(t)<<endl; //輸出60(a=60)
return 0;
}
輸出結果:
9
25
60
反正我之前是沒有見過可以有呼叫函式的形式做左值的,看來還是要去上課才是真理.
回到宿舍來分析分析。
int &fun(int x) {
a=a+x;
return a;
}
先把這一團看作一個整體。就看做fun(t)做左值時就看做是一個引用變數,引用的是a的地址,不做左值時就是呼叫函式的語句。這樣解釋,,。,等於沒有解釋
相關文章
- C++ 只能指標迴圈引用簡單測試C++指標
- C++ 引用型別簡介C++型別
- 簡單理解js閉包、型別引用....第一章JS型別
- java的引用:用C++/C的引用和指標去理解JavaC++指標
- C++ 引用計數技術及智慧指標的簡單實現C++指標
- 簡單理解promisePromise
- Restful簡單理解REST
- EJB簡單理解
- BFC簡單理解
- 【C++】引用C++
- c++引用C++
- C++ 引用C++
- C++簡單vectorC++
- 【JVM】如何理解強引用、軟引用、弱引用、虛引用?JVM
- 簡單理解回撥
- 簡單理解OAuth 2.0OAuth
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- C++中引用和匿名物件的理解和本質剖析C++物件
- PHP socket 的簡單理解PHP
- 簡單理解flex佈局Flex
- MongoDB索引的簡單理解MongoDB索引
- node.js簡單理解Node.js
- 對CSRF的簡單理解
- ThreadLocal的簡單理解thread
- 快速排序的簡單理解排序
- Java的簡單理解(2)Java
- 簡單理解:ML、DB、NLP
- Spring Aop簡單理解Spring
- PHP引用的&理解PHP
- C++左值引用與右值引用C++
- c++ 左值引用與右值引用C++
- C++ 右值引用和左值引用C++
- 強引用、軟引用、弱引用、幻象引用再不理解就晚了
- C++ - 簡單工廠模式C++模式
- 詳解C++引用C++
- c++筆記_引用C++筆記
- C++右值引用C++
- 【c++】引用計數C++