C 語言struct(結(jié)構(gòu)體)語法

什么是結(jié)構(gòu)體?

結(jié)構(gòu)體是一種集合褂策,它里面包含了多個變量或數(shù)組,它們的類型可以相同谓苟,也可以不同涕癣,每個這樣的變量或數(shù)組都稱為結(jié)構(gòu)體的成員(Member).

像 int哗蜈、float、char 等是由C語言本身提供的數(shù)據(jù)類型坠韩,不能再進行分拆距潘,我們稱之為基本數(shù)據(jù)類型;而結(jié)構(gòu)體可以包含多個基本類型的數(shù)據(jù)只搁,也可以包含其他的結(jié)構(gòu)體音比,我們將它稱為復(fù)雜數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型。

結(jié)構(gòu)體的定義
/**
 *  定義一個結(jié)構(gòu)體, 結(jié)構(gòu)體本質(zhì)上也是一種數(shù)據(jù)類型
 *  類型是Books的結(jié)構(gòu)體
 */
struct Books {
    char  title[50];
    char *subject;
    int   book_id;
};

char[] 和 char * 都可以聲明一個字符, 但是是有區(qū)別的, char[] 可以直接操作字符串中的每個字符, 而char * 則不可以.
char[]是數(shù)組, 不是指針, 指針賦值可以使用點的方式或者->.
數(shù)組賦值字符串只能使用strcpy()的方式, char * 則可以直接使用(.)操作符和賦值

結(jié)構(gòu)體變量
 // 聲明 Book1氢惋,類型為 Book 
 struct Books Book1;       
    // 單個賦值
    // Book1.title = "C Programming";     
    strcpy( Book1.title, "C Programming");
    Book1.subject = "iOS 10";   /* 這個是指針, 可以直接賦值 */
    
    // 指定初始化洞翩,成員順序可以不定
    struct Books book = {
        .title = "ios開發(fā)",
        .subject= "計算機",
        .book_id = 100
    };
   // 按照成員聲明的順序初始化
  struct Books book1 = {"iOS", "計算機", 100};

說明: title是數(shù)組, 不是指針, 指針賦值可以使用點的方式或者->, 數(shù)組賦值字符串只能使用strcpy()的方式

你也可以在定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體變量:

這種寫法是在定義時聲明了變量為subject, 使用時不需要struct Subject subject 這種寫法
而是直接使用subject就可以了

struct Subject {
    char *sub;
    int book_id;
} subject; 

使用

subject.sub = "計算機"; //不需要使用struct關(guān)鍵字聲明

其他一些定義結(jié)構(gòu)體的方式

  1. 在定義結(jié)構(gòu)體的同時定義多個結(jié)構(gòu)體變量:
struct Subject {
    char *sub;
    int   book_id;
} subject1, subject2; 
  1. 在定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體變量并賦值
struct Subject {
    char *sub;
    int   book_id;
} subject = {"計算機", 100};

3.如果需要變量是固定的,后面不需要再使用結(jié)構(gòu)體名定義其他變量焰望,那么在定義時也可以不給出結(jié)構(gòu)體名骚亿,如下所示:

struct {
    char *sub;
    int   book_id;
} subject = {"計算機", 100};

結(jié)構(gòu)體設(shè)置別名

/**
 *  這種寫法是給
 *  struct person {
        char *name;
    }
 *  設(shè)置一個別名Person
 */
typedef struct person {
    char *name;
} Person;

在使用時 Person <==> struct person , 二者是等價的

需要注意的是,結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型熊赖,是創(chuàng)建變量的模板来屠,不占用內(nèi)存空間;結(jié)構(gòu)體變量才包含了實實在在的數(shù)據(jù)震鹉,需要內(nèi)存空間來存儲俱笛。

結(jié)構(gòu)體數(shù)組

所謂結(jié)構(gòu)體數(shù)組,是指數(shù)組中的每個元素都是一個結(jié)構(gòu)體传趾。在實際應(yīng)用中迎膜,結(jié)構(gòu)體數(shù)組常被用來表示一個擁有相同數(shù)據(jù)結(jié)構(gòu)的群體,比如一個班的學(xué)生墨缘、一個車間的職工等。

struct stu {
    char *name;  //姓名
    int num;  //學(xué)號
    int age;  //年齡
    char group;  //所在小組 
    float score;  //成績
} class[5];

結(jié)構(gòu)體數(shù)組在定義的同時也可以初始化零抬,例如:

struct stu {
    char *name;  //姓名
    int num;  //學(xué)號
    int age;  //年齡
    char group;  //所在小組 
    float score;  //成績
} class[5] = {
    {"Li ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"He fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
};

操作

// 取值
class[4].score;
// 修改 Li ping 的學(xué)習(xí)小組;
class[0].group = 'B';
結(jié)構(gòu)體和指針

指針也可以指向一個結(jié)構(gòu)體镊讼,定義的形式一般為:
struct 結(jié)構(gòu)體名 *變量名;

    // 聲明結(jié)構(gòu)體變量
    struct Books book = {"iOS", "計算機", 100};
    /* 結(jié)構(gòu)體指針 */
    struct Books *strP = &book;
    /* 獲取結(jié)構(gòu)體成員 */
    printf("%s", strP->title);
    printf("%s", (*strP).title);

注意,結(jié)構(gòu)體變量名和數(shù)組名不同平夜,數(shù)組名在表達式中會被轉(zhuǎn)換為數(shù)組指針蝶棋,而結(jié)構(gòu)體變量名不會,無論在任何表達式中它表示的都是整個集合本身忽妒,要想取得結(jié)構(gòu)體變量的地址玩裙,必須在前面加&兼贸,所以給 pstu 賦值只能寫作:

struct stu *pstu = &stu1;

而不能寫作:

struct stu *pstu = stu1;

還應(yīng)該注意,結(jié)構(gòu)體和結(jié)構(gòu)體變量是兩個不同的概念:結(jié)構(gòu)體是一種數(shù)據(jù)類型吃溅,是一種創(chuàng)建變量的模板溶诞,編譯器不會為它分配內(nèi)存空間,就像 int决侈、float螺垢、char 這些關(guān)鍵字本身不占用內(nèi)存一樣;結(jié)構(gòu)體變量才包含實實在在的數(shù)據(jù)赖歌,才需要內(nèi)存來存儲枉圃。下面的寫法是錯誤的,不可能去取一個結(jié)構(gòu)體名的地址庐冯,也不能將它賦值給其他變量:

struct stu *pstu = &stu;
struct stu *pstu = stu;
獲取結(jié)構(gòu)體成員

通過結(jié)構(gòu)體指針可以獲取結(jié)構(gòu)體成員孽亲,一般形式為:

(*pointer).memberName

或者:

pointer->memberName

第一種寫法中,.的優(yōu)先級高于展父,(pointer)兩邊的括號不能少返劲。如果去掉括號寫作pointer.memberName,那么就等效于(pointer.numberName)犯祠,這樣意義就完全不對了旭等。

第二種寫法中,->是一個新的運算符衡载,習(xí)慣稱它為“箭頭”搔耕,有了它,可以通過結(jié)構(gòu)體指針直接取得結(jié)構(gòu)體成員痰娱;這也是->在C語言中的唯一用途弃榨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梨睁,隨后出現(xiàn)的幾起案子鲸睛,更是在濱河造成了極大的恐慌,老刑警劉巖坡贺,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件官辈,死亡現(xiàn)場離奇詭異,居然都是意外死亡遍坟,警方通過查閱死者的電腦和手機拳亿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愿伴,“玉大人肺魁,你說我怎么就攤上這事「艚冢” “怎么了鹅经?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵寂呛,是天一觀的道長。 經(jīng)常有香客問我瘾晃,道長贷痪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任酗捌,我火速辦了婚禮呢诬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胖缤。我一直安慰自己尚镰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布哪廓。 她就那樣靜靜地躺著狗唉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涡真。 梳的紋絲不亂的頭發(fā)上分俯,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音哆料,去河邊找鬼缸剪。 笑死,一個胖子當(dāng)著我的面吹牛东亦,可吹牛的內(nèi)容都是我干的杏节。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼典阵,長吁一口氣:“原來是場噩夢啊……” “哼奋渔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起壮啊,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巡扇,失蹤者是張志新(化名)和其女友劉穎灭衷,沒想到半個月后胚鸯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晋涣,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年狸眼,在試婚紗的時候發(fā)現(xiàn)自己被綠了藤树。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡份企,死狀恐怖也榄,靈堂內(nèi)的尸體忽然破棺而出巡莹,到底是詐尸還是另有隱情司志,我是刑警寧澤甜紫,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站骂远,受9級特大地震影響囚霸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜激才,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一拓型、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘸恼,春花似錦劣挫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至靠闭,卻和暖如春帐我,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愧膀。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工拦键, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人檩淋。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓芬为,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狼钮。 傳聞我的和親對象是個殘疾皇子碳柱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容