C語言結構體(struct)常見使用方法

來源:互聯網
上載者:User

今天複習一下struct,順便挖掘一下以前沒注意的小細節:


基本定義:結構體,通俗講就像是打包封裝,把一些變數有共同特徵(比如同屬於某一類事物的屬性)的變數封裝在內部,通過一定方法訪問修改內部變數。



結構體定義:


第一種:只有結構體定義

struct stuff{        char job[20];        int age;        float height;};


第二種:附加變數初始化的結構體定義

//直接帶變數名Huqinweistruct stuff{        char job[20];        int age;        float height;}Huqinwei;

也許初期看不習慣容易困惑,其實這就相當於:

struct stuff{        char job[20];        int age;        float height;};struct stuff Huqinwei;

第三種:如果該結構體你只用一個變數Huqinwei,而不再需要用

struct stuff yourname;
去定義第二個變數。

那麼,附加變數初始化的結構體定義還可進一步簡化出第三種

struct{        char job[20];        int age;        float height;}Huqinwei;
把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變數了——至少我現在沒掌握這種方法。

結構體變數及其內部成員變數的定義及訪問:

繞口吧?要分清結構體變數和結構體內部成員變數的概念。


就像剛才的第二種提到的,結構體變數的聲明可以用:

struct stuff yourname;
其成員變數的定義可以隨聲明進行:

   struct stuff Huqinwei = {"manager",30,185};

也可以考慮結構體之間的賦值:

        struct stuff faker = Huqinwei;//或    struct stuff faker2;//      faker2 = faker;列印,可見結構體的每一個成員變數一模一樣

如果不使用上邊兩種方法,那麼成員數組的操作會稍微麻煩(用for迴圈可能好點)

        Huqinwei.job[0] = 'M';        Huqinwei.job[1] = 'a';        Huqinwei.age = 27;        Huqinwei.height = 185;

結構體成員變數的訪問除了可以藉助符號".",還可以用"->"訪問(下邊會提)。



指標和數組:

這是永遠繞不開的話題,首先是引用:


        struct stuff *ref = &Huqinwei;        ref->age = 100;        printf("age is:%d\n",Huqinwei.age);列印可見變化 

指標也是一樣的

        struct stuff *ptr;        ptr->age = 200;        printf("age is:%d\n",Huqinwei.age);200 


結構體也不能免俗,必須有數組:


struct test{        int a[3];        int b;};//對於數組和變數同時存在的情況,有如下定義方法:        struct test student[3] =      {{{66,77,55},0},                                        {{44,65,33},0},                                        {{46,99,77},0}};//特別的,可以簡化成:        struct test student[3] =       {{66,77,55,0},                                        {44,65,33,0},                                        {46,99,77,0}};


結構體嵌套:

結構體嵌套其實沒有太意外的東西,只要遵循一定規律即可:

//對於“一鎚子買賣”,其中A、B可刪,不過最好帶著struct A{         struct B{             int c;        }        b;}a;//使用如下方式訪問:a.b.c = 10; 
特別的,可以一邊定義結構體B,一邊就使用上:

struct A{        struct B{                int c;        }b;        struct B sb;}a;
使用方法與測試:

        a.b.c = 11;        printf("%d\n",a.b.c);        a.sb.c = 22;        printf("%d\n",a.sb.c);結果無誤。 


結構體與函數:

關於傳參,首先:

void func(int);func(a.b.c);
把結構體中的int成員變數當做和普通int變數一樣的東西來使用,是不用腦子就想到的一種方法。

另外兩種就是傳遞副本和指標了 :

//struct A定義同上//設立了兩個函數,分別傳遞struct A結構體和其指標。void func1(struct A a){        printf("%d\n",a.b.c);}void func2(struct A* a){        printf("%d\n",a->b.c);}main(){        a.b.c = 112;        struct A * pa;        pa = &a;        func1(a);        func2(&a);        func2(pa);}



佔用記憶體空間:

struct結構體,在結構體定義的時候不能申請記憶體空間,不過如果是結構體變數,聲明的時候就可以分配——兩者關係就像C++的類與對象,對象才分配記憶體(不過嚴格講,作為程式碼片段,結構體定義部分“.text”真的就不佔空間了嗎?)。


結構體的大小是結構體所含變數大小的總和,並且不能用"char a[]"這種彈性(flexible)變數,必須明確大小,下面列印輸出上述結構體的size:

        printf("size of struct man:%d\n",sizeof(struct man));        printf("size:%d\n",sizeof(Huqinwei));結果毫無懸念,都是28:分別是char數組20,int變數4,浮點變數4. 

和C++的類不一樣,結構體不可以給結構體內部變數初始化,。

如下,為錯誤示範:

#include<stdio.h>//直接帶變數名Huqinweistruct stuff{//      char job[20] = "Programmer";//      char job[];//      int age = 27;//      float height = 185;}Huqinwei;



PS:結構體的聲明也要注意位置的,範圍不一樣。

C++的結構體變數的聲明定義和C有略微不同,說白了就是更“物件導向”風格化,要求更低。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.