1. 程式人生 > >嵌入式開發第9天(結構體,列舉,共同體,typedef)

嵌入式開發第9天(結構體,列舉,共同體,typedef)

複合資料型別
自定義型別,由基本的型別構成

結構體


結構體型別定義
struct 名字{
基本的型別;


};

結構體的大小是怎麼算出來的?

struct student_info
{
char name[19]; //19       
char sex;       //1        
char number[21];//21  
short hight;  //高度2  
int age;        //4    
int  weight; //4     
};

以結構體內最大的資料型別為寬度(doble雖然是8但依舊以4位的寬度儲存,要了兩層)

所以先存19位

然後新增1位sex

補平  4*5的寬度再填21位

但空出3位才補平

因為short為2 所以填上

空一位,因為int的寬度為4,不可能塞進去,

所以另開一行。所以一共是 52~

結構體的使用
有這麼一個結構體struct student_info型別


初始化方法1
struct student_info zhangsan = {"zhangsan",'m',"007",1.41,22,70};
struct student_info lisi     = {"lisi",'w',"008",180,22,50}; 


初始化方法2

struct student_info zhangsan = {

.name = "zhangsan",

.sex = 'm',.number = "007",

.hight = 1.41,

.age = 22,

.weight = 70};

struct student_info lisi   = {

.name="lisi",

.sex='w',

.number ="008",

.hight = 180,

.age = 22,

.weight = 50}; 


初始化方法3


逐個賦值
zhangsan.age = 22;
zhangsan.sex = 'm';
strcpy(zhangsan.name,"zhangsan");  //對於字串,同仁方法要為strcpy方法

賦值方法4

從輸入端獲取資訊。

char[20={0};

printf("please input student name:\n");
bzero(array,20);
fgets(array,20,stdin);
        
strcpy(wangwu.name,array);


1、初始化學生資訊(四個同學),資訊包括(姓名,年齡,學號,性別,身高,體重,高數成績math,C語言成績,物理成績phy。要求至少兩種方法,至少有兩個同學資訊手動輸入




struct student_info *wan
定義指標物件裡,切記用malloc分配空間
wan = malloc(sizeof(struct student_info));
指向物件的成員 
指標->成員    wan->age;




2、列舉(據說是閹割過的東西,本義是限制範圍,但我現在還不知他該用在什麼地方

enum 名字(可自己定義)

成員;


舉個粟子:

enum week
{
Monday,      //預設是0
Tuesday,      //1
Wednesday,//2
Thursday,//3
Friday,//4
Saturda,//5
Sunday//6
};

列舉變數的預設值從0開始,往後第一個成員逐個加1


int main(void)
{
enum week week_day;

week_day = 0;


switch(week_day)
{


case 0:


printf("Today is Monday!\n");

break;



case 1:

printf("Today is Tuesday!\n");

break
;

case 2:

printf("Today is Wednesday!\n");

break;



case 3:

printf("Today is Thursday!\n");

break;


case 4:

printf("Today is Friday!\n");


break;



case 5:

printf("Today is Saturday!\n");


break;




case 6:

printf("Today is Sunday!\n");


break;

default:
printf("can't find the day!\n");
break;


}


}

聯合體
union 名字(可以自定義)

成員;
int a;
double b;
char c;
};


聯合體所佔的位元組數為位元組數最大的那個值,賦值的變數值會覆蓋之前變數的值




===============================================================================
如判斷當前系統處理器是大端還是小端
所謂大小端
指的是CPU本身對資料的儲存方式
大端:高位資料放在低位地址
小端:高位資料放在高位地址

採用0x12345678來驗證當前系統是大端還是小端

思路:
在一個int 地址裡傳入一個數據0x1234678
讀該基地址上的一個位元組。  char
如果值是12,就是大端。
如果值是78,就是小端。

使用union,裡面定義一個int 一個char ,對int賦值,,獲取char的值,12 就是大端

int main(int argc,char **argv)
{
 int i;
i=1;
char *p=(char *)&i;
if(*p==1)
printf("small")
return 0;
}

==========================================================


typedef  取別字的關鍵字


typedef 已知型別(系統定義) 自定義型別
typedef int  my_int;//my_int 代替了int 型別
typedef char* char_p; 
typedef struct student
{




}*people;


可移植


typedef int   u32;
typedef short u16;
typedef char  u8;




1、建立一個包含有10同學基本資訊的“列表”,採用指標方式去完成
基本資訊包括:學號(1~99),姓名,性別,電話,QQ
要求:學號是隨機數 []





2、輸入一個日期(年,月,日),使用結構體,判斷是在本年的哪一天(注意閏年)




3、選作:把1中的列表,按學號從大到小排列