數組:只能由多個相同類型的數據構成
結構體:可以由多個不同類型的數據構成 ,結構體的類型是不存在的,自己定義
int main() { // 1.定義結構體類型 定義類型的時候是沒有分配內存的 struct Person { // 裡面的3個變量,可以稱為是結構體的成員或者屬性 int age; // 年齡 double height; // 身高 char *name; // 姓名 }; //注意分號 // 1.定義結構體類型 struct Person p = {20, 1.55, "jack"}; p.age = 30; p.name = "rose"; printf("age=%d, name=%s, height=%f\n", p.age, p.name, p.height); /* 錯誤寫法 struct Person p2; p2 = {30, 1.67, "jake"}; */ struct Person p2 = {.height = 1.78, .name="jim", .age=30}; //p2.age = 25; return 0; }
1.定義結構體變量的3種方式 1> 先定義類型,再定義變量(分開定義) struct Student { int age; }; struct Student stu; 2> 定義類型的同時定義變量 struct Student { int age; } stu; struct Student stu2; 3> 定義類型的同時定義變量(省略了類型名稱)//無法重用 struct { int age; } stu;
int main() { struct RankRecord { int no; // 序號 4 char *name; // 名稱 8 int score; // 積分 4 }; /* struct RankRecord r1 = {1, "jack", 5000}; struct RankRecord r2 = {2, "jim", 500}; struct RankRecord r3 = {3, "jake",300}; */ struct RankRecord records[3] = { {1, "jack", 5000}, {2, "jim", 500}, {3, "jake",300} }; for (int i = 0; i<3; i++) { printf("%d\t%s\t%d\n", records[i].no, records[i].name, records[i].score); } return 0; }
#include <stdio.h> /* 1.指向結構體的指針的定義 struct Student *p; 2.利用指針訪問結構體的成員 1> (*p).成員名稱 2> p->成員名稱 */ int main() { struct Student { int no; int age; }; // 結構體變量 struct Student stu = {1, 20}; // 指針變量p將來指向struct Student類型的數據 struct Student *p; // 指針變量p指向了stu變量 p = &stu; p->age = 30; // 第一種方式 printf("age=%d, no=%d\n", stu.age, stu.no); // 第二種方式 printf("age=%d, no=%d\n", (*p).age, (*p).no); // 第三種方式 是比較常用的 printf("age=%d, no=%d\n", p->age, p->no); return 0; }
#include <stdio.h> struct Student { int age; int no; }; // 如果結構體作為函數參數,只是將實參結構體所有成員的值對應地賦值給了形參結構體的所有成員 // 修改函數內部結構體的成員不會影響外面的實參結構體 void test(struct Student s) { s.age = 30; s.no = 2; } // 會影響外面的實參結構體 void test2(struct Student *p) { p->age = 15; p->no = 2; } void test3(struct Student *p) { struct Student stu2 = {15, 2}; p = &stu2; p->age = 16; p->no = 3; } int main() { struct Student stu = {28, 1}; //test(stu); //test2(&stu); test3(&stu); printf("age=%d, no=%d\n", stu.age, stu.no); return 0; }
#include <stdio.h> int main() { struct Date { int year; int month; int day; }; // 類型 struct Student { int no; // 學號 struct Date birthday; // 生日 struct Date ruxueDate; // 入學日期 // 這種寫法是錯誤的 //struct Student stu; }; struct Student stu = {1, {2000, 9, 10}, {2012, 9, 10}}; printf("year=%d,month=%d,day=%d\n", stu.birthday.year, stu.birthday.month, stu.birthday.day); return 0; }
#include <stdio.h> int main() { enum Sex { Man, Woman, Unkown}; // 0男 1女 -1不詳 //int sex = 3; //enum Sex s = Unkown; // 1.定義枚舉類型 enum Season { spring = 1, summer, //枚舉中的值其實都是整型的常量 從0開始 也可以自定義開始值 autumn, winter }; // 2.定義枚舉變量 enum Season s = 100000; //c語言是弱類型語言,枚舉不正確的值不會報錯 printf("%d\n", s); //輸出的是整型常量 return 0; }