第十六次课大纲

动态链表

练习题:

给15分钟写此程序,然后讲解两点内容:
1)结构体的大小,sizeof()获取
2)读程序讲解建立链表过程:pnew总是开辟新结点,pend总是指向最后结点,用p2和p1连接两个结点。

3)输出链表:循环初始条件,迭代,终止条件

共用体union

和struct非常相似的一个东西是union,union的定义和引用与struct是非常相似的:

union student{
    int num;
    int score;
}s1,s2;                //3种定义类型和变量的方式:类型定义与变量定义同时定义、分开定义、省略类型名称。

s1.num = 3;            //使用点.运算符进行引用共用体的成员
s1.score = 5  /
s2.num = 4;  

union和struct不同的是:
结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度,使用sizeof证明该观点:

#include <stdio.h>
int main(){
	union Data{
		int i;
		float j;
		char k;
	};
	union Data a;
	printf("%d
",sizeof(union Data));
	return 0;
}

上述程序输出结果是4,当把char k修改为char a[8],那么结果是8.如果改为char a[7]结果还是8,主要是考虑到字对齐。
另外同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬时只能存放其中一个成员,而不是同时存放几个。这也就是为什么叫联合(union),那么在对共用体变量初始化,但初始化表中只能有一个常量。共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就取代。

#include <stdio.h>
int main(){
	union Data{
		int i;
		float j;
		char k;
	};
	union Data a;
	a.i=66;
	a.k=65;	
	
	printf("%d
",a.i);
	printf("%c
",a.k);
	printf("%f
",a.j);
	
	printf("%d
",sizeof(union Data));
	return 0;
}

输出结果分别是65,A和0.0000,在该存储单元中存储的是二进制01代码,只是按照不同类型读取出来,浮点数的存放分为尾数和指数,尾数部分为0,那么指数部分再大,整个浮点数也是0.

枚举enum

枚举是一种数据类型,声明枚举类型用enum开头,定义也分为类型的定义和变量的定义:

enum Weekday{sun,mon,tue,wed,thu,fri,sat};  //定义类型

enum Weekday  workday,weekend;      //定义变量

workday的值只能是{sun,mon,tue,wed,thu,fri,sat}中的一个,不可以被赋值为其他数据,所谓“枚举”就是指把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。
那么sun这些值到底是什么类型的数?C编译对枚举类型的枚举元素按常量处理,故称枚举常量。不要因为它们是标识符(有名字)而把它们看作变量,不能对它们赋值。例如: sun=0; mon=1; 错误。每一个枚举常量都代表一个整数,C语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5…
sun的值为0,mon的值为1,…sat的值为6。如果有赋值语句: workday=mon; 相当于workday=1;

枚举的用处一:可作为输入输出

实际上,在C语言内部中,enum就是int,所以每个枚举类型的变量是可以像int一样进行输入与输出的。

#include <stdio.h>
enum color {red,yellow,green}; //声明一个新的数据类型color,类似int/float

int main(void){
    enum color t = red;       //定义变量t,t的类型是enum color类型,t的值是red
    scanf("%d",&t);
	printf("%d
",t);
    
    return 0;
}

枚举的用处二:可作为计数器

typedef 数据类型的重命名参见听课笔记

原文地址:https://www.cnblogs.com/c-programing-language/p/6723253.html