iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1
Software Development

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

C++ 30天屠龍記(第11天): 指針資料結構

  • 分享至 

  • xImage
  •  

在 Day 10有大規模改動,大家可以去看看,講的是變數同步

那好吧,在談指針資料結構之前,我先講一下指針的優缺點

優缺點

對 現代C++而言

  • 優化資料訪問速度,在OOP當中優勢尤其大
  • 自動化變量刪除/管理,比GC language速度快,但比其他老no GC 語言(C/C++98)安全得多,效果類似RUST

缺點

  • 比較長的宣告
  • 不能用auto

對 C 而言(這個欄目是給想在學完C++後學C/Go的邦友看的)

  • 優化資料訪問速度
  • 模仿出 OOP結構
  • 模仿出Lambda 函數(他們叫這個Function Pointer)
  • 模仿出近乎任何結構

缺點

  • 不安全,例如忘了刪除用完的Pointer.......(不適用於 Go和其他新語言)
  • 非常難以明白,例如 int *(*ptr[10])(int*);

理解了指針的好壞,那麼下一步就建立一個指針吧

建立指針結構

因為指針改動比較多,那麼我羅列五種建立方式,讓不同版本的人都可以用

C++14/17

auto number1 = make_unique<double>(3.5);
auto number2 = make_shared<double>(9.2);
  • Shared 和Unique用法不同,要注意
  • include<memory>

Pointer與普通變數轉換

類型 變數 Pointer
數值 var *var
地址 &var var
  • 地址是Pointer一個比較廣泛叫法,其實用法就是Day 10所講的一樣

這個表概括了3個重點

Pointer需要使用 * 獲得變數

auto number1 = make_unique<double>(3.5);
cout << *number1 << endl;
cout << "這是地址 " << number1 << " 不是數值。"<< endl;

Pointer 同步

//例子1
auto number1 = make_shared<double>(3.5);
auto number2 = make_shared<double>(4.7);
number1 = number2;

*number2 = 1.1;
//例子2
auto number3 = 3;
auto number4 = make_shared<int>(645);
&number3 = number4;
  • 你可以將指針 的number1 看成普通變數的&number1

  • number1number 2成功同步,number1number2變成3.5,最後變成1.1

  • number3number4成功同步,兩者現在是645,注意 &number3number4意思是一樣的

  • make_unqiue 建立出來的Pointer無法使用變數同步功能以換取速度,但如果不需要同步,可以看下面兩個方法

Pointer 變數傳遞

//例子1
auto number1 = make_unique<double>(3.5);
auto number2 = make_unique<double>(4.7);
*number1 = *number2;
*number2 = 1.1;

//例子2
auto number3 = 3;
auto number4 = make_shared<int>(645);
number3 = *number4;
  • 僅僅變數傳遞,你可將*number1 看成普通變數的number1
  • *number2最後變成1.1,但*number1最後並沒有跟著改變,而是4.7

Pointer 移動

  • 這是在當Pointer1需要獲取另一個Pointer2的所有內容
  • 並且不用Pointer2 時使用
auto number1 = make_unique<double>(3.5);
auto number2 = make_unique<double>(4.7);

number2 = move(number1);
//number1 變成了空(nullptr)了
//number2獲取number1的所有屬性

//這時輸出*number1會出錯
cout << *number1 << endl; 

Pointer 與函數

Pointer與函數的交互是這樣

auto addPtr(auto &a){
    *a = *a + 1;
}
int main(){
  auto b = make_unique<double>(3.5);
  addPtr(b);
  
  return 0;
}
  • & 的意思在這裡依然是可改動的
  • *a 獲得 Pointer的value

今日結語

今日講了Pointer作為數據結構怎麼去使用,那麼明天開始談物件式編程。這將會好玩很多


上一篇
C++ 30天屠龍記(第10天): 指針的概念
下一篇
C++ 30天屠龍記(第12天): 對象式編程
系列文
C++ 30天屠龍記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言