1. 程式人生 > >C語言語法教程-結構體

C語言語法教程-結構體

再次 staf har 語言 指向 取出 但是 進行 字符數

2018-09-30

結構體中成員變量地址是連續的,結構體用於描述記錄。

Create a struct

//----------------------------
//struct1.c
//創建一個結構體,給結構體成員賦值,並輸出一個成員值。
//----------------------------
#include <stdio.h>
struct teacher
{
/*
no、name、sex是成員
*/
    int no;
    char *name;//將存儲字符串的變量聲明為指針的形式,下面會談到。
    char *sex;
};//使用中括號括起成員列表,後面加上分號
/*
上面是結構體聲明,也可以放在main函數裏面。
struct是結構體關鍵字,teacher是結構體名,struct teacher是結構體類型。
*/

int main(int argc, char const *argv[])
{
    struct teacher tech1;//定義一個結構體變量tech1,再次說明,teacher是結構體名。另外,丟掉struct也是可以的。
    tech1.no=1001;//成員賦值
    /*
    在聲明結構體的時候,將存儲字符串的變量聲明為指針的形式,就可以在main函數中使用下面這種形式進行字符串變量賦值了。
    */
    tech1.name="wangfang";
    tech1.sex="女";
    //也可以這樣:struct teacher tech1 = {1001,"wangfang","女"};不可以分開喲。
    struct teacher *p;//定義一個指向結構體的指針變量p
    /*
    一個指向變量的指針表示的是占內存中起始位置,一個指向結構體的變量的指針表示的是這個結構體變量占內存中的起始位置,同樣它也可以指向結構體變量數組。
    為啥指針變量非要是struct teacher類型。因為通過指針變量存儲的地址可以訪問此地址以及後續地址所存儲的內容,但是如何解析這個內容呢?
  所以要給指針聲明類型,那麽聲明什麽樣的類型呢?顯然,你要解析出什麽樣的類型就聲明什麽樣的類型,你是要按訪問的類型解析,所以指針類型和其所指向的變量類型一致。
    */
    p=&tech1;//使用取地址符將結構體變量的地址給指針p
    printf(p->sex);
    /*
    使用p->sex這樣的形式訪問成員,這裏的箭頭與指針搭配。也可以用tech1.sex,或者把tech1換成指針也可以,像這樣(*p).sex。
    */
    return 0;
}

Create a struct pointer

//-------------------------------------
//--- struct2.c
//--- 介紹結構體指針,通過指針訪問結構體成員值。
//-------------------------------------
#include <stdio.h>
struct teacher
{
    int no;
    char name[10];
    char sex[10];
};

int main(int argc, char const *argv[])
{
    struct teacher tech1;
    struct teacher *p;
    p=&tech1;
    scanf("%d",&(p->no));//p->no通過指針取出了成員變量no;&(p->no)取出了該成員變量的地址
    printf("%d",tech1.no);

    scanf("%s",p->sex);
    /*
    p->sex通過指針取出了字符數組成員變量sex;而p->sex就是字符數組的首地址。如果成員變量sex是指針,像struct1.c那樣,那麽scanf("%s",p->sex)是行不通的。
    */
    
    printf("%s",tech1.sex);//也可以用printf(tech1.sex)
    return 0;
}

Create a struct array

//-------------------------------------
//--- struct3.c
//--- 介紹結構體數組
//-------------------------------------
#include <stdio.h>
struct teacher
{
    int     no;
    char    name[10];
    char    sex[10];
}tech[3]={
        {1001,"wang fang", "女"},
        {1002,"zhou yu", "女"},
        {1003,"zhang han", "女"}};
int main(int argc, char const *argv[])
{
    struct teacher *p;
    p=tech;//指針指向結構體數組
    printf("%s",p->sex);
    return 0;
}
/*
p+1表示數組中第2個元素tech[1]的起始地址
*/

Create an union

//-------------------------------------
//--- struct4.c
//--- 介紹共用體(聯合體)
//-------------------------------------

#include <stdio.h>
typedef struct
{
    int             no;
    char    name[10];
    char    sex[10];
    int             job;
    union//這是聯合體關鍵字,聯合體成員共用一塊內存單元,共有首地址,內存單元長度由占用空間最大的成員決定。同一時刻只有一個成員有效。
    {
        int     class;//學生有班級無職稱
        char    prof[20];//教師有職稱無班級
        //教師和學生只能選擇一種屬性,故適合用聯合體。至於引用,就像這樣staf[2].category.class。
    }category;
}STAFFER;
//使用typedef對結構體重新定義後,結構體類型為STAFFER

int main(int argc, char const *argv[])
{
    STAFFER staf[20];
    //code//
    return 0;
}

C語言語法教程-結構體