淺談結構體

         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 這個成員

                    二、使用第一種訪問方式比第二種指針訪問訪問效率低了不少,由於第一種方式它耗用大量的內存資源。

相關文章
相關標籤/搜索