1. 程式人生 > >C語言結構體學習總結

C語言結構體學習總結

C語言中包含short、int、long、char、float、double這六中基本資料型別。當然還有構造型別、指標型別、和空型別。如圖所示:

今天,我們著重總結一下構造資料型別中的結構體 (關鍵字:struct,不能省略) 的相關知識。

1.什麼是結構體?

結構體是一種工具,用這個工具可以定義自己的資料型別。同時,從上圖可以看出結構體屬於構造資料型別。

2.結構體與陣列的比較

(1)都由多個元素組成

(2)各個元素在記憶體中的儲存空間是連續的

(3)陣列中各個元素的資料型別相同,而結構體中的各個元素的資料型別可以不相同

3.結構體的定義和使用

(1)一般形式

struct 結構體名 {
    型別名1 成員名1;  //成員型別可以是基本型別或構造型
    型別名2 成員名2;
    ...
    型別名n 成員名n;
};    //注意不要忘記此處的;

例如,我們要表示一個學生的個人基本資訊。如 姓名、性別、年齡、分數等基本資訊,我們則可以如下定義:

struct Student{
    char name[10];
    char sex;
    int age;
    float score;
};

(2)定義結構體型別的變數、指標變數和陣列

定義結構體型別變數有以下三種方法,本人比較喜歡第三種。

方法一:定義結構體型別時,同時定義該型別的變數

struct [Student] {   /*[]表示結構體名是可選的*/
    char name[10];
    char sex;
    int age;
    float score;
}stu1,*ps,stu[5]; /*定義結構體型別的普通變數,指標變數和陣列*/

方法二:先定義結構體型別,再定義該型別的變數

struct Student {   /*[]表示結構體名是可選的*/
    char name[10];
    char sex;
    int age;
    float score;
};

struct Student stu1,*ps,stu[5]; /*定義結構體型別的普通變數,指標變數和陣列*/

方法三:用型別定義符typedef先給結構體型別名別名,再用別名定義變數

typedef struct [Student] {
    char name[10];
    char sex;
    int age;
    float score;
}Stu;
Stu stu1,*ps,stu[5]; /*用別名定義結構體型別的普通變數,指標變數和陣列*/

說明:

結構體型別與結構體變數概念不同。

1.型別:不分配記憶體;變數:分配記憶體;

2.型別:不能賦值、存取、運算;變數:可以;

3.結構體可以巢狀;

4.結構體成員名與程式中變數名可相同,不會混淆。

例如:

struct date{
    int month;
    int year;

};


struct student{
    int num;
    char name[20];
    struct date birthday;  /*結構體可巢狀*/

}Stu;

(3)給結構體變數賦初值

一般格式:結構體型別 結構體變數名 = {初始表值};

方法一:

 struct [Student] {
    char name[10];
    char sex;
    int age;
    float score;
}stu[2]={{"ZhangSan",'F',22,90},{"Su",'M',20,85}};

方法二:

struct student{
    char name[10];
    int age;
    float score[5],ave;
};

struct student  Stu = {"ZhangSan",22,99,78,99,76,88};

注:ANSI C允許兩個相同結構的結構體變數直接賦值

struct student li,zhang = {"zhang",20,92,90,98,67,0};
       li=zhang;  //將zhang物件拷貝一份賦值給li
            /*但 li = {"li",19,76,56,90,69,80};是非法的*/

(4)引用結構體變數中的成員

a.結構體變數名·成員名:stu1.name

b.結構體指標變數—>成員名:ps—>name

c.(*結構體指標變數).成員名:(*ps).name

d.結構體變數陣列名.成員名:stu[0].name

注:1.求結構體型別資料的位元組數

sizeof(變數名或型別名);

2.巢狀結構體中成員的引用

結構體巢狀時,逐級引用

struct student{
    int num;
    char name[20];
    struct date{
        int month;
        int day;
        int year;
    }Birthday;

}stu1,stu2;


//給出生日期的年份賦值
stu1.Btrthday.year = 1999;

4.結構體指標變數的定義和引用

1.結構體指標變數的定義

定義形式:struct 結構體名 *結構體指標名;

struct student *p;  //此時指標變數*p中存放的是----結構體變數在記憶體的起始地址


//例:

struct student{
    int num;
    char name[20];
    char sex;
    int age;
}Stu;
struct student *p = &Stu;

2.結構體指標變數的引用

使用結構體指標變數引用成員形式

(*結構體指標變數名).成員名 <=> 結構體指標變數名—>成員名 <=> 結構體變數名.成員名(<=>是等價符號哈,各位看官莫慌=_=!)

例:

int n;
int *p = &n;
*p = 10; <=> n = 10;
struct student{
    long int num;
    char name[20];
    char sex;
    float score;
}Stu1;

struct student *p = &Stu1;

Stu1.num = 10; <=> (*p).num = 101; <=>p —>num = 101;

 

5.用結構體型別和基本資料型別的定義變數的對比

 

注:感謝博主 I come,I conquer  的博文幫助,附上原文地址:https://www.cnblogs.com/JCSU/articles/1487302.html