C語言初級階段6——自定義數據類型
闡述
1.構造數據類型:用戶自己建立的數據類型(自定義數據類型)。
2.C語言中的自定義數據類型:數組類型、結構體類型、共用體類型和枚舉類型。
結構體
1.定義:C語言允許用戶根據自己建立的由不同類型數據組成的組合型的數據類型,我們把它稱之為結構體(struct)。
2.作用:
結構體能根據用戶需要來更方便的儲存各種各樣的信息。
3.結構體類型的聲明和結構體變量的定義
聲明一個結構體類型的一般形式為:
struct 結構體類型名{成員列表};
#include<stdio.h>
#include<string.h>
//結構體的定義:struct
/*struct 結構體名
{
結構成員;
}
*/
//怎么訪問定義的結構體變量里面的成員 變量名.成員
//定義了一個名字叫做Student的結構
struct Student
{
int ID;
char name[10];
float score;
};
Student ab = { 2,"李四",90.9f };
//Student ab={第一個賦值給第一個定義的成員,第二個值賦值給第二個定義的成員...}
//typedef給類型取別名 #define Π 3.14 宏定義,宏的原理表示替換。
//typedef int 整型;
typedef struct Hero
{
int ATT;
char name[10];
int Def;
}hero;
//定義結構體的時候沒有寫結構名,那么typedef給這個結構體取別名。
typedef struct
{
int x;
int y;
}STT;
/*定義結構體的時候沒寫結構名,也沒有用typedef取別名,
但是在}后面寫了標識符,那么這幾個標識符就是我們定義的該結構的變量。
那么這幾個標識符就是我們定義的該結構體的變量*/
struct
{
int m;
int n;
}s1,s2,s3[10];
//結構體的嵌套
struct A
{
int f;
struct
{
int g;
}h;
};
struct CC
{
struct A f;
};
//結構體的內存計算方法
struct One
{
int a;
int b;
char c;
};
//內存對齊標準:以該結構體中最大的基本數據類型所占的內存進行對齊
struct Two
{
int a;
char b[10];
float c;
};
struct Three
{
double a;
int b;
char c[10];
};
struct Four
{
int a;
char b[10];
char c;
double d;
};
/*當結構數據成員前面有更大的數據類型所站內存,先按照順序進行最大的數據類型進行內存分配進行對齊。
如果在最后還有比前面更大的基本數據類型所占內存,那么就按照更大的進行對齊。*/
struct Five
{
char a;
int b;
char c[10];
double d;
};
int main() {
printf("One的字節數為:%d\n", sizeof(One));
printf("Two的字節數為:%d\n", sizeof(Two));
printf("Three的字節數為:%d\n", sizeof(Three));
printf("Four的字節數為:%d\n", sizeof(Four));
printf("Five的字節數為:%d\n", sizeof(Five));
CC cc;
cc.f.h;
A fff;
fff.h.g;
hero arr[4] = {
{10,"劍圣",5},
{5,"蓋倫",10},
{0,"法師",0}
};
for (int i = 0; i < 3; i++)
{
printf("%d\t%s\t%d\n", arr[i].ATT, arr[i].name, arr[i].Def);
}
s3[0] = { 1,2 };
s1 = { 1,2 };
STT tt;
hero YX1 = { 10,"劍圣",5 };
int a = 10;
int b = 20;
Student aa = { 1,"張三",60.1f};
aa.ID = 10;
strcpy(aa.name,"張三");
aa.score = 1.6f;
//aa.name="張三";這是不可以的。
return 0;
}
共用體
1.關鍵字:union
2.有時候想用同一段內存單元存放不同類型的變量。如:把一個整型變量、浮點型變量和字符型變量放在同一個內存單元中,它們在內存中所占字節數不同,但是共用同一段內存地址,也就是共用體。
3.也就是所有數據成員共用同一段內存的數據類型稱為共用體,也稱其為聯合體。
4.共用體和結構體的聲明、定義和成員變量引用的語法是類似的,只不過關鍵字不一樣,以及所占內存大小有區別而已。
#include<stdio.h>
#include<string.h>
/*內存儲存:共用體所有的成員共用里面最大的成員的空間,在同一個時刻只能存儲一個成員的值。
只算最大的成員所占的內存,要以共用體中最大的基本數據類型所占內存進行對齊。*/
union Arr
{
int c;
char a[10];
float b;
};
int main() {
printf("Arr的字節數為:%d\n", sizeof(Arr));
return 0;
}
枚舉類型
1.關鍵字:enum
#include<stdio.h>
#include<string.h>
/*枚舉類型內存大小:就是int類型的所占內存大小
枚舉的元素會有一個默認的值,是整數,第一個元素默認的值為0 第n個元素的值是第n-1個元素的值+1*/
enum Arr1
{
left,
right,
up,
down
};
int main() {
printf("Arr1的字節數為:%d\n", sizeof(Arr1));
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
enum {up='w',down='s',right='d',left='a' };
int main() {
while (1)
{
switch (_getch()) {
case up:
printf("你按了上這個鍵\n");
break;
case down:
printf("你按了下這個鍵\n");
break;
case left:
printf("你按了左這個鍵\n");
break;
case right:
printf("你按了右這個鍵\n");
break;
}
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
typedef enum {up='w',down='s',right='d',left='a' } Arr3;
int main() {
Arr3 a;
printf("%d\n", up);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
typedef enum {up='w',down='s',right='d',left='a' } Arr3;
enum Arr4
{
a,b,c,d,e,f
};
int main() {
printf("%d\n", up);
printf("%d\n%d\n%d\n%d\n%d\n%d\n", a, b, c, d, e, f);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
typedef enum {up='w',down='s',right='d',left='a' } Arr3;
enum Arr4
{
a,b,c=10,d,e,f
};
int main() {
printf("%d\n", up);
printf("%d\n%d\n%d\n%d\n%d\n%d\n", a, b, c, d, e, f);
return 0;
}
浙公網安備 33010602011771號