文章目录

  • 结构体struct :类型设计
    • 结构体赋值
    • 结构体类型指针
    • 结构体的内存对齐
    • 基本数据类型字节数
    • 指定对齐值
  • 联合体union
  • 枚举:把需要的取值一一列举
    • 枚举与#define的区别
  • 字符串

结构体struct :类型设计

  1. 形参的改变不会改变实参
  2. 单独的定义会存在数组名的退化,但在结构体中的数组不存在数组名的退化
    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
}

结构体赋值

  1. 定义结构体变量 { }初始化
  2. 用已定义的结构变量初始化
  3. 结构体类型相同的变量可以作为整体相互赋值 //赋值

结构体类型指针

  1. (*p).成员名
  2. 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;
}

结构体的内存对齐

  1. 结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍
  2. 结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍
  3. 结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍

基本数据类型字节数

注意:
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 || 结构体 联合体 枚举类型 字符串相关推荐

  1. SV学习笔记—结构体及枚举类型及字符串

    目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...

  2. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  3. 结构体,枚举类型与联合体

    目录 ​编辑 一.结构体的基本使用 1.什么是结构体 2.结构体的一般声明 3.结构体的特殊声明 4.结构体的自引用 5.结构体变量的定义和初始化 二.结构体内存对齐 1.内存对齐规则 3.为什么会存 ...

  4. 结构体、枚举类型和联合体

    文章目录 一:结构体的基本使用 1.什么是结构体 2.结构体的声明 (1):一般声明 (2):特殊声明 3.结构体的自引用 4.结构体变量的定义和初始化 二:结构体的内存对齐 1.内存对齐规则 2.练 ...

  5. c语言结构体联合体与枚举考点,C语言-结构体+联合体+枚举

    #include #include #include //1.结构体:是一种构造数据类型 //结构体的用途:把不同的数据类型整合起来,成为一个自定义的数据类型 //1.1 定义一个结构体(定义结构体的 ...

  6. 【数字IC验证快速入门】14、SystemVerilog学习之基本语法1(数组、队列、结构体、枚举、字符串...内含实践练习)

    导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...

  7. C语言自定义类型的介绍(结构体,枚举,联合体,位段)

    ⭐️前面的话⭐️ 大家好!在C语言中,有个叫"自定义类型"玩意,它究竟是什么呢?其实,就是字面意思,可以自己定义的类型就是自定义类型.具体说就是我们熟知的结构体,枚举,位段,联合体 ...

  8. 自定义类型: 结构体,枚举,联合

       1.结构体    个人认为结构体和数组特别相似,只不过结构体和数组的区别在于结构体的成员可以是不同类型,而数组成员类型是相同的.    (1)结构体的声明 struct tag {成员列表//至 ...

  9. 【C语言进阶】结构体 位段 枚举 联合体详解

    目录 1.结构体 1.1结构体的基础类型 1.2结构的声明 1.3特殊的声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐(计算结构体的大小) 1.6.1 结构体对齐规则 ...

最新文章

  1. Android 开发者必知的开发资源
  2. cytoscape插件centiscape的使用
  3. LINQ教程二:LINQ操作语法
  4. mysql数据库的常用操作-索引
  5. python读取文件名-Python获取指定文件夹下的文件名的方法
  6. 软件项目管理0819:一页项目管理——风险,定性问题和其他评价指标
  7. 扫地机器人粘住老鼠板怎么办_家里老鼠的危害性及如何有效灭鼠
  8. python调用接口获取文件_python接口文件使用说明
  9. mysql自带压测工具--mysqlslap
  10. 你的计算机usb管理策略,您的计算机已经实施了USB存储设备管理策略,系统发现你使用了USB存储设备,该设备已被阻止,如有疑问请与...
  11. NHibernate Linq中Null值排序的解决方法
  12. 一个方法解决Warning: Permanently added 'gitee.com,180.97.125.228' (ECDSA) to the list of
  13. 如何解决Xshell使用时中文字体是躺倒显示的问题
  14. 动态规划求解金矿问题
  15. linux引导程序下载,SysLinux 4.05 下载 功能强大的引导加载程序
  16. XtraReport打印二维码
  17. PHPCMS模块分析之广告模块详解----北冥神功破解法(一)
  18. Codeforces1696 C. Fishingprince Plays With Array
  19. 几何结构因子(Geometrical structure factor)和原子形状因子(atomic form factor)
  20. nuxt框架Universal和Spa两种render mode的区别

热门文章

  1. CSFB 主叫 被叫
  2. Java 实现阿里云直播
  3. 超级玛丽游戏python实现
  4. 雅思阅读真经总纲_想提高雅思阅读?这是你一定要知道的8本书
  5. 部署storm和配置文件详解
  6. centOS 安装dns服务器
  7. VirtualBox 报错VERR_VD_IMAGE_READ_ONLY
  8. 高德AR实景导航,出差旅行好帮手,轻轻松松找对路
  9. 【定语从句练习题】who、which
  10. centos7 KVM网桥桥接、网卡绑定