iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 10
1
Software Development

C++ 30天屠龍記系列 第 10

C++ 30天屠龍記(第10天): 指針的概念

剛開始先放圖

Fill Cup

&:前言

在寫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了
}

&:和Return 的分別

但是,下面的函數也能做到一樣的效果

auto add(auto a){
  a++;
  return a;
}
int main(){
  int a = 0;
  a = add(a); 
}
  • 這句多了return回傳statement,而且有第二課講過的=傳入符號。(忘記的朋友可以去Day2複習)
  • return捕捉了假a在function裏最後的數值也就是a++,並回傳 1這個數值
  • 而在main裏,function利用=傳入1真a
  • 用圖去解釋,其實就是這個意思

Fill Cup

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;
  • 需要有兩個已經建立的變量喔
  • 以上兩種狀態都會令到a,b 的數值同步,但不同的是
  • 第一行中 a和b會變成b的數值
  • 第二行中 a和b會變成a的數值
  • 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
  • 其實你看看先前那個杯子的GIF,你就發現其實&就是同步變量的鑰匙

今日結語

雖然文章不長,但大家已經學會Pointer的基本概念了。

大家可能覺得奇怪,為什麼今天沒有說Pointer中最有名的*呢?因為Pointer除了是一個概念,也可以是一個自動內存管理的資料結構,而普通變數的指針應用和Pointer中的指針應用有不少相似之處,所以我就先讓大家理解普通變數的部分。


上一篇
C++ 30天屠龍記(第9天): 基礎語法 - String
下一篇
C++ 30天屠龍記(第11天): 指針資料結構
系列文
C++ 30天屠龍記30

尚未有邦友留言

立即登入留言