* (const struct class **) p = class;
#include
#include
#include
#include
#include
void
test
(void);
struct string
;struct class
;void
test
(void
)static
const
struct class _string =
;const
void
* string =
& _string;
/** *
*/int
main
(int argc,
char
const
*ar**)
;struct string * p =
(struct string *
)calloc(1
,sizeof
(struct string));
return0;
}
我們有如下定義:
struct string
;struct class
;
首先我們申請乙個記憶體void * p = calloc(1, sizeof(struct string));
,這裡很好理解,這個時候我們想讓p
變成乙個指向struct string
型別的一塊記憶體,只需要申請的時候加上強制轉換就可以了struct string * p = (struct string *)calloc(1, sizeof(struct string));
,這個時候p
就是乙個指向struct string
型別元素的乙個結構體指標。
接下來看下這個使用方法*(const struct class **) p = class;
很多人看到第一眼的時候,第一眼就本能的將後面兩個取址符與前面乙個解引用相互抵消最終得出下面這樣的結論,實際效果相當於:
(const struct class *) p = class;
,你要是真的這樣想就大錯特錯了。
這裡的意思其實是如下圖:
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-yfadxb79-1590937267126)(u:\linux-sys\ooc\doc\picture\指向指標的指解引用之後與指標的區別.png)]
在經過上述操作之後,p
指標指向了string
結構體,而* (const struct class **) p = class;
的作用就是講string
中的void *
型別的指標class
指向string
結構體,注意是結構體不是型別,解如圖中那樣,string
結構體其實是乙個struct class
型別的結構體指標。
static
const
struct class _string =
;const
void
* string =
& _string;
*指標指向新申請記憶體的目的
const
struct class *
*-- 告訴編譯器這個指標是個二維指標,第乙個指標是指向string結構體,結構體中又有兩個指標,第二個指標說明的是取結構體指標中的指標,具體取得哪個指標就由前面給出的型別來決定了,這裡取得是乙個`struct class`結構體指標。
因為這個時候取得是雙重指標,有因為p本身又是指標,要想和class這個指標對應上,需要對指標進行一次解引用,這也就形成了下面這種方式,在c語言中實現取結構體指標中的指標的方式*(
const
struct class *
*) p = class;
C語言 如何物件導向程式設計
基類 class object virtual double calcuarae 0 計算表面積 virtual double calcuvolume 0 計算體積 有乙個共同的屬性 double height 圓柱體 class cylinder public object virtual dou...
C 語言物件導向程式設計 繼承
繼承就是基於乙個已有的類 一般稱作父類或基類 再去重新宣告或建立乙個新的類,這個類可以稱為子類或派生類。子類或派生類可以訪問父類的資料和函式,然後子類裡面又新增了自己的屬性和資料。在 c 語言裡面,可以通過結構體巢狀的方式去實現類的單繼承 暫不考慮多重繼承 但有一點注意事項,就是在結構體巢狀時,父類...
程式語言 C 中的物件導向
最近終於學到了c 了,真的很高興啊!畢竟是要從面向過程跳到物件導向的時候了,雖然以前學過c 但是還是覺得自己的物件導向的思想很不做,希望通過對c 的學習能夠打下乙個堅實的基礎,然後在這個基礎上再學習其他新的物件導向語言就不是事兒了。一 介紹篇 c 是一種安全的 穩定的 簡單的 優雅的,由c和c 衍生...