c語言的結構(struct):包含多個成員,可能有多種資料型別,並且需要分配幾種型別占用空間之和的空間。
聯合(union):支援多種型別,供使用者使用其中一種資料型別,當然是需要分配其中占用空間最大的資料型別的大小。
結構和聯合通常是出現在一塊的。
php是用c語言來實現的,那麼思考下為什麼php可以實現弱型別呢?
答案就在c語言的結構和聯合上。
從弱型別變數的寫入和讀取二者分析:
有了聯合,我們可以定義幾種型別,讓php的變數在其中選取,這個可以解決變數寫入。那怎麼解決讀取這個變數呢?變數設定後,不知道這個變數使用的聯合中哪個型別,也就沒法讀取。
可以在結構中,設定乙個成員專門記錄聯合中用的哪個型別。這樣就ok了。
用乙個簡單的c例子演示一下:這裡只使用了三種型別,整數 浮點數和字串,php的陣列是用hashtable這裡就不說了。
#include typedef union uval uval;typedef
struct
pval pval;
//enum
void
var_dump(pval);
intmain(), 1
}; var_dump(pval1);
//int 111
pval1.phptype = 2
; pval1.val.b = 1.21
; var_dump(pval1);
//float 1.210000
pval1.phptype = 3
; pval1.val.c = "
abc"
; var_dump(pval1);
//string abc}/*
* * @param val
* 根據pval變數型別,決定讀取聯合體的那個型別 */
void
var_dump(pval val)
else
if(val.phptype == 2
) else
if(val.phptype == 3
)}
可以認為pval這種型別就是php的乙個變數的型別。每乙個php變數記錄了這個值val和型別phptype(實際還有引用計數等)。
每次寫入val時,要把其型別也記錄下來。這樣就實現了弱型別。
C語言之結構和聯合
一 結構體 宣告乙個結構體型別的一般形式為 struct 結構體名 成員表列 如 struct student 定義結構體型別變數 1 先宣告結構體型別再定義變數名 例如 struct student student1,student2 2 在宣告型別的同時定義變數 這種般形式為 struct 結構...
C 結構和聯合
結構與聯合體是c語言中就已經存在的資料型別。c 語言對它們進行了擴充套件,最大的變化是允許在結構和聯體中定義成員函式。1 include2 using namespace std 3struct room 7struct student 14 15int main 17 student s 18,8...
D語言中的結構和聯合
聚集宣告 標記標記 標誌符標記 標誌符 標記 structunionaggregatedeclaration tagtag identifiertag identifier tag structunion結構和聯合是簡單的資料聚集,是同硬體或者外部型別通訊的資料結構。外部型別可以由作業系統 api ...