首页 > 其他分享 >结构体,联合体,枚举

结构体,联合体,枚举

时间:2023-07-22 20:57:59浏览次数:22  
标签:struct int s1 联合体 学生 char Stu 枚举 结构

结构体

  1. 结构体是不同类型的值的集合,用struct关键字声明,我们可以用这个定义好的结构体创建多个学生对象,并且可以初始化他们各自的成员信息。最后我们通过.操作符访问成员的相应属性。
#include <stdio.h>

// 定义一个学生类型的结构体
struct Stu
{	
	// 学生姓名
	char name[20];
	// 学生年龄
	int age;
	// 学生性别
	char gender[6];
};

int main(void)
{
	// 学生s1
	struct Stu s1 = {"张三", 18, "男"};
	// 学生s2
	struct Stu s2 = {"李四", 20, "女"};
	// 学生s3
	struct Stu s3 = {"王五", 22, "保密"};

	//打印学生信息
	printf("第一个学生的信息: %s %d %s\n第二个学生的信息: %s %d %s\n第三个学生的信息: %s %d %s\n", s1.name, s1.age, s1.gender,s2.name, s2.age, s2.gender,s3.name, s3.age, s3.gender);

	return 0;
}

image

注意:我们可以用typedef关键字对结构体变量进行重命。
2. 上面我们定义了一个结构体变量,当然我们也可以定义一个结构体指针,区别是结构体指针访问成员的属性的方式不同,用的是->操作符。

#include <stdio.h>

// 定义一个学生类型的结构体
struct Stu
{
	// 学生姓名
	char name[10];
	// 学生年龄
	int age;
	// 学生性别
	char gender[6];

int main(void)
{
	struct Stu* s;
	s = (struct Stu*)malloc(sizeof(struct Stu));
	strcpy(s->name,"小明");
	s->age = 22;
	strcpy(s->gender,"男");
	return 0;
}

  1. 结构体内还可以嵌套结构体
#include <stdio.h>

// 定义一个学生类型的结构体
struct Stu
{
	// 学生姓名
	char name[10];
	// 学生年龄
	int age;
	// 学生性别
	char gender[6];


// 定义一个人的类型的结构体
struct Person
{
	// 家庭地址
	char addr[20];
	// 联系电话
	char tele[12];
	struct Stu s1;	
};

int main(void)
{
	struct Person p = {"四川省成都市","13988775544",{"小慧", 23, "女"}};
	printf("家庭地址:%s 电话:%s 姓名:%s 年龄:%d 性别:%s\n", p.addr, p.tele, p.s1.name,p.s1.age,p.s1.gender);

	return 0;
}

  1. 关于计算结构体的大小(结构体的内存对齐)
#include <stdio.h>


struct S
{
	char c;
	double d;
	int i;
};

int main(void)
{

	printf("%ld\n", sizeof(struct S));

	return 0;
}

image
首先字符c就在开始位置占一个字节,然后看double d我当前操作系统的默认对齐数是8,double也是八个字节,所以对齐数是8,它必须是地址的整数倍,所以double从偏移量为8的位置开始占位8个字节,int i4个字节,与默认对齐数8比较较小值是4,所以i从偏移量为16处开始占位四个字节。到现在已经占有20个字节了,还有最后一条规则就是结构体的总大小是每个成员中的最大对齐数那个数的整数倍,当前结构体中的最大对齐数就是8,20不是8的整数倍,所以还要往后占用四个字节大小空间直到总大小为24个字节才是8的整数倍。
image
image

联合体

声明联合体的关键字是union,联合体里面的成员共用一块内存空间,且在同一时间这块内存空间只能被一个成员使用。
在联合体中,可以应用在判断当前操作系统是大端存储还是小端存储。利用的原理就是所有成员共用一块内存空间。

#include <stdio.h>


union U
{
	char c;
	int i;
}u;

int main(void)
{
	u.i = 1;
	if(1 == u.c)
		printf("小端\n");
	else
		printf("大端\n");	

	return 0;
}

image

枚举

那些可以列举且有限的常量可以用枚举的形式存储起来使用,关键字enum

#include <stdio.h>

// 三原色
enum Color
{
	RED,
	GREEN,
	BLUE
};

int main(void)
{
	printf("%d\n", RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);
	
	return 0;
}

标签:struct,int,s1,联合体,学生,char,Stu,枚举,结构
From: https://www.cnblogs.com/bcc0729/p/17574096.html

相关文章

  • 子代选择器 结构伪类选择器
    包含选择器后代选择器包含的是后代子代选择器包含儿子 div>p则只有儿子收到效果  ulli:first-child{    color:red;  }   ulli:nth-child(2){    color:aqua;  }   ulli:nth-child(3){    color:yellowgr......
  • 2.格式化输出&&分支结构
    2.格式化输出&&分支结构一.格式化输入输出1.输出注意:使用printf()时最好添加头文件#include。格式printf("%类型",值);#include<iostream>#include<cstdio>usingnamespacestd;intmain(){ printf("%d",123);printf("哈哈哈"); return0;......
  • 1.C++入门&&简单顺序结构-习题
    1.C++入门&&简单顺序结构1.计算(a+b)*c的值 inta,b,c; cin>>a>>b>>c; cout<<(a+b)*c;2.带余除法 inta,b; cin>>a>>b; cout<<a/b<<""<<a%b; //C++中取余结果正负只与%前面的数有关系 cout<<5%2<<endl......
  • 计算机存储单元结构
    存储层次结构概况这是我们非常熟悉的冯·诺依曼计算机结构,那这其中哪些部件和存储功能有关呢?  存储器和外部记录介质肯定具有存储功能,另外还有一个自带存储功能的运算器,为了描述方便,我们把这些部件统称为存储器。那么我们看一下计算机中对存储器有哪些要求?1、首先存储器......
  • matlab 郭彦甫 3 结构化程式与自定义函数
    1.脚本文件  保存文件格式 *.m  文件格式函数部分  fx  包含绝大部分的函数介绍注释为   行前加一个 %    如果为连续多行 需要先选中这些行 右键选择注释两个 %%  将下面的部分分为section   区块 通常用于debug    ......
  • 7.21语言结构学习
    语言结构学习第一题,答案;第二题,答案写,第一题,答案多少;第二题,答案多少......
  • 数据结构思维 翻译完成
    数据结构思维中文版原书:ThinkDataStructures:AlgorithmsandInformationRetrievalinJava译者:飞龙版本:1.0.0自豪地采用谷歌翻译在线阅读PDF格式EPUB格式MOBI格式代码仓库赞助我协议CCBY-NC-SA4.0......
  • c++入门以及简单顺序结构-习题
    1.c++入门以及简单顺序结构-习题1.计算(a+b)*c的值inta,b,c;cin>>a>>b>>c;cout<<(a+b)*c;2.带余除法inta,b;cin>>a>>b;cout<<a/b<<""<<a%b;//c++中取余结果正负只与%前面的正负有关系 cout<<5%2<<endl;//输出1 c......
  • 2.分支结构-习题
    2.分支结构-习题1.偶数【题目描述】读入一个正整数a,如果a为偶数输出yes。【输入】一个正整数a【输出】偶数输出yes,否则什么也不输出。【输入样例】12【输出样例】yes#include<iostream>usingnamespacestd;intmain(){ inta; cin>>a; if(a%2==0) { c......
  • SVN的标准目录结构:trunk、branches、tags
    我们在一些著名开源项目的版本库中,通常可以看到trunk,branches,tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。trunk是主分支,是日常开发进行的地方。branches是分支......