c语言的自定义类型-创新互联

c语言的自定义类型
  • 一,结构体
    • 1.说明
    • 2.声明
    • 3.应用
    • 4.结构体变量的定义和初始化
    • 5.结构体内存对齐:计算结构体的大小
    • 6.为什么存在内存对齐
  • 二,枚举
  • 三,联合(共用体)

我们提供的服务有:网站设计、网站建设、微信公众号开发、网站优化、网站认证、陈巴尔虎ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的陈巴尔虎网站制作公司一,结构体 1.说明

结构体是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。

2.声明
struct tag
{member - list;
}variable-list;
3.应用
//struct Stu
//{//	char name[20];
//	int age;
//}s1,s2;//全局变量,s1和s2是两个结构体变量
typedef struct Stu
{char name[20];
	int age;
}stu;
int main()
{struct Stu s3, s4;//局部变量
	stu s5;
	return 0;
}
特殊的声明:在声明结构体的时候,可以不完全声明
匿名结构体
struct
{int a;
	char b;
	float c;
}x,a[20],*p;
p=&x;同一个类型的匿名结构体,只能使用一次,该语句不合法
typedef struct
{int date;
	Node* next;//Node是重命名过后才有的,这是先有鸡还是先有蛋的问题,这样做是不能通过的
}Node;
typedef struct Node
{int date;
	Node* next;//同上
}Node;
//
typedef struct Node
{int date;
	struct Node* next;//合法
}Node;
4.结构体变量的定义和初始化
struct point
{int x;
	int y;
}p1 = {10,20};
struct point p2 = {0,0 };
struct s
{int num;
	char ch;
	struct point p;
	float d;
};
int main()
{struct point p3 = {1,2 };
	struct s s = {100,'m',{2,5},3.14f };
	struct s s2 = {.d=1.2f,.p.x=3,.p.y=5,.ch='w',.num=200};//乱序赋值,通过‘ . ’实现
	printf("%d %c %d %d %f\n", s.num, s.ch, s.p.x, s.p.y, s.d);
	printf("%d %c %d %d %f\n", s2.num, s2.ch, s2.p.x, s2.p.y, s2.d);
	return 0;
}
5.结构体内存对齐:计算结构体的大小
#includestruct s1
{char c1;
	int i;
	char c2;
};
struct s2
{char c1;
	char c2;
	int i;
};
struct s3
{double c1;
	char c2;
	int i;
};
struct s4
{char c1;
	struct s3 s3;
	double d;
};
int main()
{printf("%d\n", sizeof(struct s1));
	printf("%d\n", sizeof(struct s2));
	printf("%d\n", sizeof(struct s3));
	printf("%d\n", sizeof(struct s4));
	printf("%d", offsetof(struct s1, c2));//offsetof是宏,计算的是结构体变量在结构体中的偏移量
	return 0;
}

1.结构体的第一个成员,对齐到结构体在内存中存放位置的0偏移处
2.从第二个成员开始,每个成员都要对齐到(一个对齐数)的整数倍偏移处 对齐数:结构体成员自身大小和默认对齐数的较小值(vs的默认对齐数是8)
3.结构体的总大小,必须是所有成员的对齐数中大对齐数的整数倍,包含嵌套结构体成员中的对齐数。
4.如果结构体中嵌套了结构体成员,要将嵌套的结构体成员对齐到自己的成员中大对齐数的整数倍数

6.为什么存在内存对齐

1.平台原因 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常
2.性能原因 数据结构(尤其是栈)应该尽可能在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问; 而对齐的内存访问仅需要一次访问;
总体来说:结构体的内存对齐是拿空间换时间的做法

二,枚举
枚举:
enum color
{blue,
	red,
	green,
	yellow
};//枚举常量如果不初始化,则常量的值默认从零开始,并依次增1,也就是0,1,2,3
enum color
{blue,
	red,
	green=6,
	yellow
};//枚举常量被赋值,因此常量值为0,1,6,7
//既然是常量,值就不能被修改
三,联合(共用体)
//联合(共用体)
union Un
{char c;
	int a;
};//两个变量共用同一块空间

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页题目:c语言的自定义类型-创新互联
转载来于:http://azwzsj.com/article/disijs.html