剛開始先放圖
在寫Lambda
函數的時候,看見了[&]
,[=]
,[x]
,[&x]
,突然想起,這可能是一個不錯的Pointer切入點,所以今天就用Lambda
來開啟Pointer之旅喇。
還記得當lambda寫在main()
中間大概是什麼樣子嗎?
大概是這個樣子
int main(){
auto a = 0;
//這行讀取a並將他回傳給b
auto b = [a](){
return a;
};
//&可以讀寫a
//也就是說可以更改a
//所以現在 a 是 1
[&a](){
a++;
};
}
&a
可以寫入變數,而a
就是只讀變數,這個功能就叫做這個特性也同樣適用於__小括號變數__,如
//這個方法可以讀寫a
auto add = [](auto &a){
a++;
};
int main(){
int a = 0;
add(a);
//現在變成 a
}
a
甚至__普通函數__都可以,但需要註明型別
auto add(int &a){
a++;
}
int main(){
int a = 0;
add(a);
//現在a變成1了
}
但是,下面的函數也能做到一樣的效果
auto add(auto a){
a++;
return a;
}
int main(){
int a = 0;
a = add(a);
}
return
回傳statement,而且有第二課講過的=
傳入符號。(忘記的朋友可以去Day2複習)return
捕捉了假a
在function裏最後的數值也就是a++
,並回傳 1
這個數值=
傳入1
給真a
。auto add(auto a, auto b){
a = a+b;
return a;
}
int main(){
auto a=0,b=4;
a = add(a, b);
}
return
的作用就是把a+b
這個運算結果返回,而剛好函數裏的 a 儲存著這個a+b
的運算結果而已。採用這個方法,當數值a改變數值時,數值b也可以跟著改變,變得一樣,以下是syntax
//這是同步的syntax
//第一種狀態
&a = &b;
//這是第二種狀態
&a = &b;
//例子
auto a = 10;
auto b = 5;
&a = &b;
cout << a << " " << b << endl;
a = -3;
if(a == b){
cout << "a 和 b 現在都是一樣的,都是 " << b << endl;
}else {
cout << "a 和 b 是不同的, a 是" << a << ",b是" << b << endl;
}
//輸出
5 5
a 和 b 現在都是一樣的,都是 -3
雖然文章不長,但大家已經學會Pointer的基本概念了。
大家可能覺得奇怪,為什麼今天沒有說Pointer中最有名的*
呢?因為Pointer除了是一個概念,也可以是一個自動內存管理的資料結構,而普通變數的指針應用和Pointer中的指針應用有不少相似之處,所以我就先讓大家理解普通變數的部分。