c || 结构体 联合体 枚举类型 字符串
文章目录
- 结构体struct :类型设计
- 结构体赋值
- 结构体类型指针
- 结构体的内存对齐
- 基本数据类型字节数
- 指定对齐值
- 联合体union
- 枚举:把需要的取值一一列举
- 枚举与#define的区别
- 字符串
结构体struct :类型设计
- 形参的改变不会改变实参
- 单独的定义会存在数组名的退化,但在结构体中的数组不存在数组名的退化
3)调用对象的属性使用 对象名.属性
调用指针的属性使用 指针->属性
struct Student//类型设计{char s_id[10];char s_name[10];int s_age;}stud; //对象void InitStudent(struct Student *stud) //初始化结构体 传入自己的地址{printf("id name age \n");scanf_s("%s",stud->s_id);scanf_s("%s",stud->s_name); //数组名本身就表示地址scanf_s("%d",&stud->s_id); //整形 要传地址 否则形参不能改变实参}void PrintStudent(const struct Student *stud) //输出结构体内容 不希望改变参数值{assert(stud!=NULL);printf("id name age \n");scanf_s("%s",stud->s_id);scanf_s("%s",stud->s_name); //数组名本身就表示地址scanf_s("%d",stud->s_id); //整形 要传地址 否则形参不能改变实参}
int main()
{struct Student x; //x被称为对象,操纵结构体变量,用(.)进行使用struct Student x = {"09001","lili",18}; //按照顺序初始化,和结构体顺序要保持一致struct Student *p = &x;printf("%s \n",(*p).s_id); //指针的属性输出printf("%s \n",p->s_id);struct Student y = x; //可以进行初始化struct Student z = {};z = x; //可以进行赋值printf("%s \n",x.s_id); //输出使用.运算符strcpy_s(x.s_id,10,"09001");//引入#in clude<string.h>,vs2019不用strcpy,改为strcpy_sint a;//a被称为变量InitStudent(&studx); //初始化studx 使用自己本身PrintStudent(&studx);return 0;
}
int main() //字符串
{char s_id[20] = {"020303"}; //ok 初始化可以char s_id[20]; s_id = {"292929"} //err 不能赋值 数组名退化为指针常量 不能进行赋值int ar[10]; 数组定义:类型 大小sizeof(ar); //sizeof(int)*10 40
}
结构体赋值
- 定义结构体变量 { }初始化
- 用已定义的结构变量初始化
- 结构体类型相同的变量可以作为整体相互赋值 //赋值
结构体类型指针
- (*p).成员名
- p->成员名
#include<stdio.h>
#include<iostream>
using namespace std;
struct Student
{char s_name[8]; //8int s_age;//12
};
void Prinf(const struct Student* sp) //打印函数 不会改变 加上常属性
{cout << sp->s_age << " " << sp->s_name << endl;
}
int main()
{int n = sizeof(Student);cout << n<<endl; //12struct Student sta = { "lee",21 };Student* stb = &sta; //初始化char name[20] = { 0 };(*stb).s_age = 18; stb->s_age = 18;strcpy_s(name, stb->s_name);printf("%d\n", stb->s_age);cout << (*stb).s_name << endl;Prinf(stb);return 0;
}
结构体的内存对齐
- 结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍
- 结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍
- 结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍
基本数据类型字节数
注意:
CPU不是以逐字节读写内存,而是以2,4,8的倍数的字节块来读写内存,因此基本数据类型的地址必须是2,4,8的倍数,那就要求各种数据类型按照一定的规则在空间上排列,这就是对齐
struct node
{char cha; //1 偏移7个字节 8double da; //16 char chb; //1 偏移7个字节 24
}; //sizeof(struct node) = 24struct node
{char ch[3]; //3 偏移1个字节int ia; //8
}; //sizeof(struct node) = 8struct sdate //12
{int year;int month;int day;
};
struct Student
{char s_id[10]; //10char s_name[8];//18struct sdate birthday; //12+18 30 基本数据类型 intdouble grade; //30+8 38 偏移2 到40 最大数据类型
}; //sizeof(Student) = 40
指定对齐值
预处理指令 #pragma pack(n) 可以改变默认对齐数 n = 1,2,4,8,16
需要以**#pragma pack()结束**,表示该种对齐方式到此为止
VS中默认值 = 8; gcc默认值 = 4
#pragma pack(4)
struct node
{char cha; //1int ia; //8short sa; //12
}; //sizeof(node) = 12
#pragma pack()#pragma pack(1)
struct node
{char cha; //1int ia; //1+4 = 5short sa; //5+2 = 7
}; //sizeof(node) = 7
#pragma pack()#pragma pack(8)
struct anode
{short sa; //2 long int ib; //8
};//8
struct bnode
{char ca; //1 8struct anode ad; //8+8 16double dx; //24
}; //24
#pragma pack()
例题:
struct Student
{char s_name[20];int age;int score;
};
int Sumscore(struct Student* sp,int n) //总成绩
{int sum = 0;for(int i = 0; i < n; i++){sum += sp[i].score;}return sum;
}
int Ave(struct Student* p, int n) //平均成绩
{int sum = Sumscore(p, n);int ave = sum / n;return ave;
}
void SortByScore(struct Student* p, int n) //按成绩排序
{for (int i = 0; i < n; i++){if (p[i].score > p[i + 1].score){swap(p[i].score, p[i + 1].score);}}
}
void Printf(struct Student* p, int n)
{for (int i = 0; i < n; i++){cout << p[i].s_name << " " << p[i].age << " " << p[i].score << endl;}
}
int main()
{struct Student cla[ ] ={{"lee",18,40},{"lolo",40,23},{"rere",34,23},};int k = sizeof(cla) / sizeof(cla[0]);int sum = Sumscore(cla, k);cout << sum << endl;int ave = Ave(cla, k);cout << ave << endl;SortByScore(cla, k);Printf(cla, k);return 0;
}
联合体union
1.结构体各成员有各自的内存空间,在联合体中,各成员共享同一段内存空间。
2.一个联合体变量的长度等于各成员中最长的长度
3.一个联合体类型必须经过定义之后,才能使用它,才能把一个变量声明定义为联合体类型
共享指的是联合体变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
union Data
{short st;char cs[2];
}x;
枚举:把需要的取值一一列举
特点:
1)受到限制的有符号整形类型;
2)枚举值必须是整型类型;
3)枚举变量的取值范围必须是枚举值集合
4)枚举变量的取值只能赋值为{枚举值集合中值};
5)枚举变量不能++,–
//不指定值,默认从0开始 往后逐个加一
enum week{mon,tue,wend,thurs,fri,sat,sun};
//指定值
enum week{mon = 1,tues = 2,wed = 3,thurs = 4};
//只给第一个名字指定值 往后逐个加一
enum week{mon = 1,thes,wed,thurs,fri,sat,sun};
enum week x = Mon;
枚举与#define的区别
1.增加代码的可读性和可维护性
2.枚举类型有类型检查,更严谨
3.封装性好
3.一次可以定义多个常量
//整型转换成枚举
int main(){enum day{saturday,sunday,monday,tuesday,wednesday,thursday,friday}workday;int a=1;enum day weekend;weekend=(enum day)a;printf("weekend:%d",weekend);return 0;
}
字符串
- print输出格式
c || 结构体 联合体 枚举类型 字符串相关推荐
- SV学习笔记—结构体及枚举类型及字符串
目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- 结构体,枚举类型与联合体
目录 编辑 一.结构体的基本使用 1.什么是结构体 2.结构体的一般声明 3.结构体的特殊声明 4.结构体的自引用 5.结构体变量的定义和初始化 二.结构体内存对齐 1.内存对齐规则 3.为什么会存 ...
- 结构体、枚举类型和联合体
文章目录 一:结构体的基本使用 1.什么是结构体 2.结构体的声明 (1):一般声明 (2):特殊声明 3.结构体的自引用 4.结构体变量的定义和初始化 二:结构体的内存对齐 1.内存对齐规则 2.练 ...
- c语言结构体联合体与枚举考点,C语言-结构体+联合体+枚举
#include #include #include //1.结构体:是一种构造数据类型 //结构体的用途:把不同的数据类型整合起来,成为一个自定义的数据类型 //1.1 定义一个结构体(定义结构体的 ...
- 【数字IC验证快速入门】14、SystemVerilog学习之基本语法1(数组、队列、结构体、枚举、字符串...内含实践练习)
导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...
- C语言自定义类型的介绍(结构体,枚举,联合体,位段)
⭐️前面的话⭐️ 大家好!在C语言中,有个叫"自定义类型"玩意,它究竟是什么呢?其实,就是字面意思,可以自己定义的类型就是自定义类型.具体说就是我们熟知的结构体,枚举,位段,联合体 ...
- 自定义类型: 结构体,枚举,联合
1.结构体 个人认为结构体和数组特别相似,只不过结构体和数组的区别在于结构体的成员可以是不同类型,而数组成员类型是相同的. (1)结构体的声明 struct tag {成员列表//至 ...
- 【C语言进阶】结构体 位段 枚举 联合体详解
目录 1.结构体 1.1结构体的基础类型 1.2结构的声明 1.3特殊的声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐(计算结构体的大小) 1.6.1 结构体对齐规则 ...
最新文章
- Android 开发者必知的开发资源
- cytoscape插件centiscape的使用
- LINQ教程二:LINQ操作语法
- mysql数据库的常用操作-索引
- python读取文件名-Python获取指定文件夹下的文件名的方法
- 软件项目管理0819:一页项目管理——风险,定性问题和其他评价指标
- 扫地机器人粘住老鼠板怎么办_家里老鼠的危害性及如何有效灭鼠
- python调用接口获取文件_python接口文件使用说明
- mysql自带压测工具--mysqlslap
- 你的计算机usb管理策略,您的计算机已经实施了USB存储设备管理策略,系统发现你使用了USB存储设备,该设备已被阻止,如有疑问请与...
- NHibernate Linq中Null值排序的解决方法
- 一个方法解决Warning: Permanently added 'gitee.com,180.97.125.228' (ECDSA) to the list of
- 如何解决Xshell使用时中文字体是躺倒显示的问题
- 动态规划求解金矿问题
- linux引导程序下载,SysLinux 4.05 下载 功能强大的引导加载程序
- XtraReport打印二维码
- PHPCMS模块分析之广告模块详解----北冥神功破解法(一)
- Codeforces1696 C. Fishingprince Plays With Array
- 几何结构因子(Geometrical structure factor)和原子形状因子(atomic form factor)
- nuxt框架Universal和Spa两种render mode的区别