C04結構體

一 、 結構體是什麼?

1.與C語言中的數組,用法跟其他語言差不多。當一個整體由多個數據構成時,可以用數組來表示這個整體,
但是數組有個特點:內部的每一個元素都必須是相同類型的數據。
2.通常需要由不同類型的數據來構成一個整體,比如學生這個整體可以由姓名、年齡、身高等數據構成,
這些數據都具有不同的類型,姓名可以是字符串類型,年齡可以是整型,身高可以是浮點型。
3.C語言專門提供了一種構造類型來解決上述問題,就是結構體,它允許內部的元素是不同類型的。

二 、 結構體有什麼用?

1.更好的管理內存,解決基本數據類型和數組都不好存儲的數據

三 、 結構體怎麼用?

方法一:先定義結構體類型再定義變量名

struct  student
{int  num;
  char  name[20];
  char  sex;
  int  age;
  char  addr[30];
};
struct   student    student1, student2;

有時,可用符號常量代表一個結構體類型 ,如:

#define STUDENT struct student
STUDENT
{int  num;
  char  name[20];
  char  sex;
  int  age;
  char  addr[30];
};

方法二:在定義類型的同時定義變量

struct  student
{int  num;
  char  name[20];
  char  sex;
  int  age;
  char  addr[30];
} student1, student2;

方法三:直接定義結構類型變量。
其一般形式是:
struct
{
成員表列
} 變量名錶列;
- 結構體變量的指針:是該結構體變量所佔居的內存段的起始地址,指向該結構體

int main( )
{
 struct student
  {
  long int num;
  char name[20];
  char sex;
  };
struct student stu_1;
struct student *p;
p=&stu_1;
return 0;
} 
  • 引用結構體成員的三種形式:
    1) 結構體變量名 . 成員名
    2) (*p).成員名
    3) p- >成員名
  • 結構體的初始化
 struct  student
{long int num;
  char name[20];
  char sex;
  char addr[20];
} stu={9801,”Wang hong”,’W’,”2 Linggong Road”};

或者

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

struct Student stu ={9801,”Wang hong”,’W’,”2 Linggong Road”}

四 、 使用結構體要注意什麼?

1.  類型與變量是不同概念,不要混淆;
2.  結構體中的成員,可以單獨使用,其作 用與地位相當於普通變量;
3.  成員名可以與程序中的變量名相同,二 者不代表同一對象。
4.  成員也可以是一個結構體變量;
5. 不能將一個結構體變量作爲一個整體進行賦值和輸出;只能對其各個成員分別輸出
6. 只能在定義變量的同時進行初始化賦值,初始化賦值和變量的定義不能分開

五 、 結構體代碼舉例

  • 例1一般應用
//一個結構體
 struct Student {
    char *name;
     int age;
 };
 struct Student stu;
// 訪問stu的age成員
 stu.age = 27;
//兩個結構體搭配
struct Date {
      int year;
      int month;
       int day;
 };
 struct Student {
      char *name;
      struct Date birthday;
 };
 struct Student stu;
 //注意成員變量的訪問
 stu.birthday.year = 1986;
 stu.birthday.month = 9;
 stu.birthday.day = 10;
  • 例2結構體作爲函數參數(值傳遞)
#include <stdio.h>
  // 定義一個結構體
 struct Student {
     int age;
 };
 void test(struct Student stu) {
      printf("修改前的形參:%d \n", stu.age);
     // 修改實參中的age
     stu.age = 10;

     printf("修改後的形參:%d \n", stu.age);
 }

 int main(int argc, const char * argv[]) {

     struct Student stu = {30};
     printf("修改前的實參:%d \n", stu.age);

     // 調用test函數
     test(stu);


    printf("修改後的實參:%d \n", stu.age);
     return 0;
 }
  • 例3 利用指向結構體數組的指針計算學生各科的平均成績
#include <stdio.h>
int main()
{
 struct STUDENT *pt;
 float  sum[4] = {0.0},average[4] = {0.0};
 int   i;
 char  *name[]={"score of Computer","score of English",
                "score of Math","score of Music"};

 pt = stu;    /*pt指向結構體數組的第一個元素*/
 for (pt=stu; pt<stu+30; pt++)
 {
  sum[0] = sum[0] + pt->scoreComputer;//用->訪問成員變量
  sum[1] = sum[1] + pt->scoreEnglish;
  sum[2] = sum[2] + pt->scoreMath;
  sum[3] = sum[3] + pt->scoreMusic;  
 }
 for (i=0; i<4; i++)
 {
     average[i] = sum[i]/4;    
  printf("%20s : %4.2f\n", name[i], *(average+i));//格式輸出,平均分保留兩位
 }
return 0;
}

六 、 結構體總結

1.不允許對結構體本身遞歸定義
2.結構體內可以包含別的結構體
3.定義結構體類型,只是說明了該類型的組成情況,並沒有給它分配存儲空間,就像系統不爲int類型本身分配空間一樣。
只有當定義屬於結構體類型的變量時,系統纔會分配存儲空間給該變量
4.結構體變量佔用的內存空間是其成員所佔內存之和,而且各成員在內存中按定義的順序依次排列
5.初始化:將各成員的初值,按順序地放在一對大括號{}中,並用逗號分隔,一一對應賦值
6.一般對結構體變量的操作是以成員爲單位進行的,引用的一般形式爲:結構體變量名.成員名
7.如果某個成員也是結構體變量,可以連續使用成員運算符"."訪問最低一級成員
8.相同類型的結構體變量之間可以進行整體賦值
9.將結構體變量作爲函數參數進行傳遞時,其實傳遞的是全部成員的值,也就是將實參中成員的值一一賦值給對應的形參成員。
因此,形參的改變不會影響到實參。
10.每個結構體變量都有自己的存儲空間和地址,因此指針也可以指向結構體變量
11.typedef 的用法 ,功能:定義新類型,即爲C語言中已有的數據類型 名定義一個新名字。 定義格式: typedef   標識符1    標識符2
發佈了36 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章