84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
如题, 不同类型的指针应该算是相同的吗?因为本质上都是地址, 那么按理来说应该是static cast, 但是由于指针类型不同好像又是应该用reinterpret cast,所以这种情况下该用哪种类型转换呢?
学习是最好的投资!
慎用reinterpret_cast,因為這貨發明出來的目的就是用來忽悠編譯器的,他的轉換僅僅是更改了解釋方式,而對實際數據沒有任何更改,如果t的类型是TYPE,那麼x=reinterpret_cast<>(t)相當於*((TYPE*)(&x))=t,如果你用reinterpret_cast去把一個int轉換到float,那它只是把二進位資料完完整整拷貝了一遍,得到的結果並沒有什麼意義…當然退一步講,用reinterpret_cast當然可以實現你想要的指標轉換
reinterpret_cast
t的类型是TYPE
x=reinterpret_cast<>(t)
*((TYPE*)(&x))=t
而static_cast會檢查類型,所以可以用於內建類型的轉換(例如從int到float就能按照語義進行轉換),但如果是對於指針,必須是同一棵繼承樹上的類型才能互相轉換,並且只有上行轉換(從子類別到基底類別)才是保證安全的。
static_cast
既然你的char*和目標指針並沒有啥繼承關係,那麼顯然只能用reinterpret_cast或C风格强转
char*
C风格强转
話說題主最近在跟內存池較勁哈…
reinterpret_cast只是進行重新解釋,並沒有實際涉及到地址的變換。在普通指標轉換的時候是沒有問題的,但是在父子類別指標之間轉換的時候,可能是不正確的結果。
慎用
reinterpret_cast
,因為這貨發明出來的目的就是用來忽悠編譯器的,他的轉換僅僅是更改了解釋方式,而對實際數據沒有任何更改,如果t的类型是TYPE
,那麼x=reinterpret_cast<>(t)
相當於*((TYPE*)(&x))=t
,如果你用reinterpret_cast
去把一個int轉換到float,那它只是把二進位資料完完整整拷貝了一遍,得到的結果並沒有什麼意義…當然退一步講,用reinterpret_cast
當然可以實現你想要的指標轉換而
static_cast
會檢查類型,所以可以用於內建類型的轉換(例如從int到float就能按照語義進行轉換),但如果是對於指針,必須是同一棵繼承樹上的類型才能互相轉換,並且只有上行轉換(從子類別到基底類別)才是保證安全的。既然你的
char*
和目標指針並沒有啥繼承關係,那麼顯然只能用reinterpret_cast
或C风格强转
話說題主最近在跟內存池較勁哈…
reinterpret_cast
只是進行重新解釋,並沒有實際涉及到地址的變換。在普通指標轉換的時候是沒有問題的,但是在父子類別指標之間轉換的時候,可能是不正確的結果。