1.引入
現實世界中的物體要 抽象成 計算機語言中的類型才能被計算機識別
屬性---->數據類型
學生:
學號 int
性別 char
姓名 char name[20]
自定義類型:結構體、共用體、枚舉
2.結構體
2.1定義格式
struct 結構體名
{
成員列表 ; // 數據類型 成員變量名
};
“結構體名”:C語言合法的標識符即可
數據類型 :C語言合法的數據類型
成員變量名:C語言合法的標識符即可
例子:
struct student
{
int No;
char sex;
char name[20];
};
struct student stu1;
struct student表示的是數據類型,stu1表示變量名
struct student *stu1;stu1表示指針變量名,struct student表示指針變量要指向的數據類型。
2.2內存中的存放
1.結構體類型所佔的內存是各成員變量的內存之和
ps:1.結構體分配的空間按變量的定義順序各自分配空間
2.內存對齊,與最長的對齊或者4的整數倍取一個最小
2.3結構體變量的引用
struct student stu1;
1.結構體類型名.成員變量名
stu.No=100;
int b=stu.No;
struct student *p;
2.結構體變量名->成員變量名
1)p=&stu1;
2)p=(struct student *)malloc(sizeof(stu1));
p->No=10;
例:#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
int No;
char sex;
char name[20];
};
int main()
{
struct student stu;
stu.No=100;
//stu.name="123";
strcpy(stu.name,"234");
printf("%s\n",stu.name);
struct student *p;
p=(struct student*)malloc(sizeof(struct student));
p->No=10;
return 0;
}
2.4結構體的初始化
1.對前面順序的n個進行初始化
struct student stu1={11401,'M',"zhangsan"};
2.對任意進行初始化
struct student stu1={
.No=123,
.name="zhangsan",
.sex='M',
};
3.結構體數組初始化化
struct student stu[5]={ {.name="zhangsan"},{},{},{},{} };
2.5 struct
{
int a;
int b;
}A,B,C;
A,B,C爲變量名,類型爲 struct {int a,int b};
typeof(A) D;
3.聯合體
union 共用體名
{
成員列表;// 成員數據類型 變量名
};
例:union a
{
char c;
int a;
};
聯合體分配的空間是最大數據類型長度的空間。
#include<stdio.h>
union a
{
int a;
char c;
};
int main()
{
union a da;//union a:表示數據類型 da 變量名
printf("%d",sizeof(da));//結果爲4 最大類型長度
return 0;
}
大端模式:低地址存高字節的內容,高地址存低字節的內容
小端模式:低地址存低字節的內容,高地址存高字節的內容
4.枚舉
把一個變量所有可能的值列舉出來
定義:enum 枚舉名{可能的值};
ps:1.枚舉的值默認爲一個整型常量,默認處理爲0,1,2,3....
2.枚舉常量mon=4是錯誤的的,不可對它進行改變
3.enum day{one=8 ,two,three};那麼one後面對應的整型常量就應該爲9 10 ...
#include<stdio.h>
enum weekday{mon,tue,wed};
enum day{one=10 ,two,three};
int main()
{
enum weekday wd;//enum weekday :數據類型 wd是變量名
wd=mon;//mon tue wed默認爲枚舉常量,不可改變
wd=4;
//mon =5;
printf("%d\n",wd);
enum day dy;
dy=two;
printf("dy=%d\n",dy);
return 0;
}
ex1.寫一個代碼,判斷是大端模式還是小端模式?
ex2.從屏幕上輸入5個學生成績、學號、姓名,按成績大小輸出學生的成績、姓名、學號
struct student
{
int grade;
int NO;
char name[20];//char *name
};
1.用scanf輸入 struct student stu[5];
2.排序
3.輸出