1、首先爲何會出現結構體呢?(這個問題得弄明白,學習的時候,要有打破砂鍋問到底的精神,本身要多問個爲何是這樣,把別人的東西變成本身的知識點)函數
在咱們學習c語言的時候,,咱們通常都會見到基本數據類型:int char float double等等,可是在表示一些複雜的的數據,顯然所學的基本數據類型是不夠了,因此這個時候咱們就引入結構體這種新的數據類型,來知足開發須要。學習
2、什麼是結構體?spa
一、 簡單的來講,結構體就是用戶根據實際需求來定義本身的複合數據類型,咱們仍是來看一個例子:指針
1 #include <stdio.h> 2 3 //這裏定義了一個一個新的數據類型爲strcut Student ,而且這個結構體裏面有三個成員,第一個佔內存4個字節,第二個200個字節,第三個4個字節 4 struct Student 5 { 6 int sid; 7 char name[200]; 8 int age; 9 };//注意這裏這個分號不要忘了寫 10 11 12 int main(void) 13 { 14 //定義了一個數據類型爲struct Student變量,名爲st 15 struct Student st={1000, "haha",20 16 }; 17 //這裏咱們經過"." 來訪問結構體裏面的成員 18 printf("%d %s %d\n", st.sid, st.name, st.age); 19 return 0; 20 21 }
運行結果以下:code
二、接下來顯示另一種賦值方式,仍是來看例子:blog
1 #include <stdio.h> 2 #include <string.h> 3 struct Student 4 { 5 int sid; 6 char name[200]; 7 int age; 8 }; 9 int main(void) 10 { 11 12 struct Student st={1000, "haha",20 13 }; 14 printf("%d %s %d\n", st.sid, st.name, st.age); 15 //這裏經過「.」訪問結構體成員來進行賦值,其實和上面差很少,只不過形式不同而已 16 st.sid=99; 17 strcpy(st.name,"lisi");//注意這裏不能這樣對字符類型的結構體成員賦值,st.name="lisi",這樣會報錯,咱們只能用字符串函數strcpy()來進行鏈接字符串 18 st.age=21; 19 printf("%d %s %d\n", st.sid, st.name, st.age); 20 return 0; 21 22 }
運行效果以下:內存
三、經過指針來訪問結構體成員,爲啥要這樣呢;由於經過上面那種方式訪問的話,它佔用內存空間大(它至少要佔用208個字節),會致使程序在運行的時候,效率低,好資源,因此呢,咱們我接下來用指針來訪問結構體成員,這樣作,相對於剛纔那種訪問方式來講,它不耗內存資源(它只佔用4個字節),運行效率高;好了咱們來看例子吧。資源
1 #include <stdio.h> 2 #include <string.h> 3 struct Student 4 { 5 int sid; 6 char name[200]; 7 int age; 8 }; 9 int main(void) 10 { 11 12 struct Student st={1000, "haha",20 13 }; 14 //這裏定義了一個struct Student 類型的指針變量pst 15 struct Student * pst ; 16 pst=&st; 17 pst->sid=99; //注意*pst=st,因此(*pst).sid等價於st.sid,因此pst->sid等價於st.sid 18 strcpy(pst->name,"lisi"); 19 pst->age=21; 20 printf("%d %s %d\n",pst->sid,pst->name,pst->age); 21 22 return 0; 23 24 }
運行結果以下,咱們能夠看到和上面那種方式訪問運行的結果同樣:開發
3、普通結構體變量和結構體變量作爲函數形參來傳遞:字符串
咱們仍是來看一段代碼:
1 #include <stdio.h> 2 #include <string.h> 3 struct Student 4 { 5 int sid; 6 char name[200]; 7 int age; 8 }; 9 void f(struct Student * pst); 10 int main(void) 11 { 12 struct Student st={1000, "haha",20 13 }; 14 //調用f()這個函數,注意這個形參是要傳遞地址的 15 f(&st); 16 printf("%d %s %d\n",st.sid,st.name,st.age); 17 return 0; 18 } 19 void f(struct Student * pst) 20 { 21 (*pst).sid=99; 22 strcpy(pst->name,"lisi"); 23 pst->age=21; 24 }
接着咱們還能夠對輸出再進行函數包裝輸出:
1 #include <stdio.h> 2 #include <string.h> 3 struct Student 4 { 5 int sid; 6 char name[200]; 7 int age; 8 }; 9 void f(struct Student * pst); 10 void g(struct Student st); 11 int main(void) 12 { 13 struct Student st={1000, "haha",20 14 }; 15 16 f(&st); 17 g(st); 18 return 0; 19 } 20 void g(struct Student st) 21 { 22 printf("%d %s %d\n",st.sid,st.name,st.age); 23 } 24 void f(struct Student * pst) 25 { 26 (*pst).sid=99; 27 strcpy(pst->name,"lisi"); 28 pst->age=21; 29 }
最終輸出的結果是:
4、總結:
一、結構體兩種訪問方式:
struct Student st ={10000,"lisi",20};
struct Student * pst;
a:
st.sid
b:
pst->sid (pst 所指向的結構體變量中的sid 這個成員
二、使用第一種訪問方式比第二種指針訪問訪問效率低了不少,由於第一種方式它耗用大量的內存資源。