1. 程式人生 > >C語言入門第十七篇,結構體

C語言入門第十七篇,結構體

結構體是C語言很重要的概念,他是資料結構的關鍵。 基本性質 個人理解結構體是一種變數的集合體,他把變數放入了一個結構裡面,形成了一個結構體。我們先看看他的基本語法。 struct 結構體名 { 結構體 } 我們看上面的基本語法可以看出,我們需要給出結構體名和內部的結構體就能宣告一個結構體變數。上面的語法還不能表現真正結構體的屬性,我們來看看一個例子,我們需要定義一個學生的結構體,裡面存放學號,姓名,性別。

struct student{
    int num;
    char name[20];
    char sex[10];
}

這只是一個結構體的定義,我們需要使用這個結構體還需要宣告一個變數,方法如下:

struct student students;

students就是一個結構體變數。那麼怎麼使用這個變數呢?如下:

scanf("%d",&students.num);
scanf("%s",students.name);
scanf("%s",students.sex);

上面的程式碼是我們對學號,姓名,性別進行輸入。可以看到我們在結構體中用點(.)來訪問結構體中的變數。可是我這樣只能輸入一個結構體,我有50個學生怎麼辦? 結構體陣列 結構體是一個變數型別,如同整型,浮點型一樣,結構體同樣也有陣列。怎樣宣告呢?

struct student students[50
];

有了結構體陣列我們就可以輸入50個學生了。這個陣列可以像我們之前利用迴圈進行輸入,具體的例子如下:

int i;
for(i=0;i<50;i++){
    scanf("%d",&students[i].num);
    scanf("%s",students[i].name);
    scanf("%s",students[i].sex);
    }

這裡深入的講一下,結構體陣列其實是資料結構中的順序連結串列,前面就講過陣列是連續的一片記憶體地址,所以結構體陣列在作為連結串列的時候是連續的一片記憶體。與之對應的當然是隨機的記憶體地址實現的連結串列,而這樣的連結串列是利用指標實現的。這些知識如果是小白的話,瞭解一下就好了,我們後面會仔細的講他的原理和實現的方法,當然這些本來是資料結構的東西,所以強烈建議大家在看了這個入門後(雖然我不知道什麼時候能寫完哈哈哈,但是儘量能在這幾個月完成這個),去學習資料結構。 結構體指標

剛剛說到連結串列的另一種實現方法就是結構體指標。這一塊就比較複雜了,但是我在前面有足夠的鋪墊。希望大家這裡能夠明白,我暫時不講怎麼樣實現50個學生的連結串列,只是介紹一下結構體指標。 結構體指標比結構體陣列要複雜一些,因為如果我們宣告一個結構體指標的話,他是沒有足夠大的記憶體空間的,所以我們需要申請記憶體(我們在前一章講過陣列申請記憶體)。我們來看看例子:

//#include<stdlib.h> 上一章忘了說了,申請記憶體需要stdlib.h這個標頭檔案
struct student *students;
students=(struct student *)malloc(sizeof(struct student));//申請記憶體
scanf("%d",students->num);
scanf("%s",students->name);
scanf("%s",students->sex);

這裡就是結構體指標的使用方法,申請記憶體的方法其實很簡單,前面的(struct student *)是後面申請的記憶體的型別強制轉換成結構體的型別,sizeof()函式就是計算student這個結構體需要多大的記憶體,最後賦值給students。結構體指標呼叫自己內部的元素時也不再用.(點)而是->這個符號。 總結 本篇介紹了結構體這種變數的內容,他只是一個變數的型別,我們需要掌握他的宣告和呼叫方式。還要熟悉結構體陣列和結構體指標這兩個結構體以後會常常用到的東西。 練習 1.能否將我這篇所說的利用結構體陣列和我給的零星的程式碼,寫出輸入10個學生基本資訊(學號,姓名,性別),並輸出。