Skip to content

Latest commit

 

History

History
executable file
·
242 lines (171 loc) · 3.36 KB

C语言学习笔记-CH06-结构类型.md

File metadata and controls

executable file
·
242 lines (171 loc) · 3.36 KB

第六章 结构类型

6.1 枚举

用枚举优化常量符号化,变得更加方便

  • enum 枚举类型名字{名字0,...,名字n};

  • Example 01:

#include <stdio.h> 

enum color{
	red,
	yellow,
	green
};

void f(enum color c);

int main(){
	enum color t = red;
	scanf("%d",&t);
	f(t);
	
	return 0;
}

void f(enum color c){
	printf("%d\n",c);
}

枚举量

  • 声明枚举量的时候可以指定值

  • enum color{
    	red = 1,
    	yellow,
    	green = 5
    };

枚举只是int

实际上很少用

6.2 结构体

声明结构类型

  • Example 01:
#include <stdio.h> 

struct date{
		int month;
		int day;
		int year;
	};
	
int main(){
	struct date today;
	today.month = 03;
	today.day = 05;
	today.year = 2020;
	printf("%i-%i-%i",today.year,today.month,today.day);
	//%i表示有符号十进制整数 
	return 0;
}

声明结构的形式

  • 形式一:
struct point{
    int x;
    int y;
};
struct point p1,p2;	// p1和p2都是point里面有x和y的值
  • 形式二:
struct{
    int x;
    int y;
}p1,p2;// p1和p2都是一种无名结构,里面有x和y
  • 形式三:(推荐)
struct point{
    int x;
    int y;
}p1,p2;
// p1和p2都是point里面有x和y的值

结构变量

struct date today;
today.month = 03;
today.day = 05;
today.year = 2020;

image-20200306092007788

结构体的初始化

struct date today = {03,05,2020};

结构成员

today.day

结构运算

  • 赋值、取地址、传递函数参数

  • p1 = (struct point){5,10}; //相当于p1.x = 5,p1.y = 10;

  • p1 = p2; //相当于p1.x = p2.x; p1.y = p2.y;

image-20200306092110362

结构可作为函数参数

bool isLeap(struct date d);

结构指针作为参数

  • 指向结构的指针
struct date{
    int month;
    int day;
    int year;
}myday;
struct date *p = &myday;
(*p).month = 12;
p -> month = 12;

用->表示指针所指的结构变量中的成员

结构数组

struct date dates[100];
struct date dates[] = {{4,5,2005},{2,4,2005}};

结构中的结构

struct dateAndTime{
    struct date sdate;
    struct time stime;
}
  • Example 01:

image-20200306092200846

image-20200306092243437

Typedef

  • typedef 自定义数据类型

image-20200306092323697

  • typedef struct{
        int month;
        int day;
        int year;
    }Date;

image-20200305211317278

6.3 联合体

union AnElt{
    int i;
    char c;
}elt1,elt2;
elt1.i = 4;
elt2.c = 'a';
  • sizeof(union ...) = // sizeof (每个成员) 的最大值
#include <stdio.h> 

typedef union{
	int i;
	char ch[sizeof(int)];
}Data;

int main(){
	Data data;
	int i;
	data.i = 1234;
	for(i=0;i<sizeof(int);i++){
		//对于%02hhx,hhx已经以一个字节打印了,加上02限制,不够两位的补成两位。 
		printf("%02hhX",data.ch[i]);
	}
	printf("\n");
	
	return 0;
}