程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言總結——結構體(struct)使用方法

C語言總結——結構體(struct)使用方法

編輯:關於C

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


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



結構體定義:


第一種:只有結構體定義

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


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

//直接帶變量名Huqinwei
struct 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
//直接帶變量名Huqinwei
struct stuff{
//      char job[20] = "Programmer";
//      char job[];
//      int age = 27;
//      float height = 185;
}Huqinwei;



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved