结构体共用体枚举____笔记
Posted 我即狂澜,且力不可挽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体共用体枚举____笔记相关的知识,希望对你有一定的参考价值。
-------------------讲在前面
老规矩,本人小菜。
互联网是发达的,神奇的。其中,有开源与不开源一说,我不知道我懂多少。
我在网上取我所需,但是有时候会标注来源,有时候没标注。如果某大神觉得被冒犯了,请联系删除。
我会有复制粘贴,但我并不认为拿过来就是我的东西,只是纯粹的欣赏,学习。
开博客,主要是觉得对自己学习有益。我会记录自己觉得有意义的东东。
如果有人见到本文章,是我的荣幸,希望对你有所帮助。
当然,我不保证绝对正确,若你发现不对的地方,可以评论或者联系,指正批评,大家相互学习。
---------------------------------------------------------------------------Now Start
2017-09-16 21:14:09
结构体,共用体,枚举
1.结构体
把不同的类型整合成一个有机的整体,以便于引用,这个类型就叫做结构体
1)结构体变量的定义方式(3种)和引用成员变量;
定义一个结构体的一般形式为
struct 结构体名
{
成员表列(成员类型 成员名);
};
!!!成员名可以和变量名重名!!!
可以采取三种方式定义结构体类型变量
a.先声明结构体类型再定义变量名
struct student
{
int num;
char name[20];
float score;
char address[30];
};
struct student stu1,stu2;
***************************************************
b.在声明类型的同时定义变量
一般形式为:
struct 结构体名
{
成员表列;
}变量名;
struct student
{
int num;
char name[20];
float score;
char address[30];
}stu1,stu2;
struct student stu3;
***************************************************
c.直接定义结构体类型变量
一般形式为:
struct
{
成员表列;
}变量名表列;
struct
{
int num;
char name[20];
float score;
char address[30];
}stu1,stu2;
struct stu3; 错误
"." 引用成员变量
***************************************************
2)结构体成员的内存布局问题及字节对其问题;
a.结构体的数据成员,第一个数据保存在offset为0的地方,以后每个数据成员存储的起始地址要从
该成员大小的整数倍或者是4的整数倍开始(取两者中的最小值);
b.如果一个结构体里面有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍开始
或者是4的整数倍开始(取两者中的最小值);
c.结构体总大小,必须是内部最大成员的整数倍或者是4的整数倍(取两者中的最小值);
3)柔性数组与指向结构体类型的指针
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { struct soft_array { int len; int array[];//占座位 }; /* struct student stu1; stu1.len = 10; stu1.array[0] = ‘a‘; struct student *p = &stu1; printf("%d\t%c\n",(*p).len,(*p).array[0]); printf("%d\t%c\n",p->len,p->array[0]); //printf("%d\n",stu1->len); 错误 // */ int n; scanf("%d",&n);//单元个数 struct soft_array *p = (struct soft_array *)malloc(sizeof(int)*n); if(p == NULL) { perror("malloc error"); return -1; } p->len = n; int i; for(i = 0;i < n -1;i++)//len 已经占用了一个int,所以array占用的int个数为n-1 { p->array[i] = 100+i; printf("%d\t",p->array[i]); } return 0; }
->(指向运算符) 只能是指针使用
4)结构体数组
struct student
{
int num;
char name[20];
float score;
char address[30];
}struct student stu[10];
5)结构体做函数参数
#include<stdio.h> struct student { int num; char name[20]; float score; char address[30]; }; void func(struct student *a) { printf("%d %s\n",a[0].num,a[0].name); } int main(int argc,char *argv[]) { struct student stu1[2] = {1,"xiaoming",100,"BeiJing"}; func(stu1); return 0; }
------------------------------------------------------------------------
2.共用体
所有成员共用同一段内存空间,空间有多大,视其中最大成员而定,
他们的首地址都相同!!!
定义共用体的方式和结构体前两种方式一样!!!
union 共用体名
{
成员表列;
};
大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,
而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:
地址由小向大增加,而数据从高位往低位放;
小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,
而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,
高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
判断是小端模式还是大端模式:
#include<stdio.h> int main(int argc,char *argv[]) { union test { int a; char b; }; union test t; t.a = 0x12345678; //printf("%p %p",&t.a,&t.b); printf("%x\n",t.b); return 0; }
------------------------------------------------------------------------
3.枚举
enum 枚举名 {成员}
枚举类型在内存中间占据4字节的unsigned int !!!
#include<stdio.h> int main(int argc,char *argv[]) { enum day {Monday=1,Friday=5, Sunday}; enum day Tuesday = 2; //要求赋值是给到的枚举出来的类型 printf("%d %d %d %d\n",Monday,Tuesday ,Friday,Sunday); return 0; }
------------------------------------------------------------------------
以上是关于结构体共用体枚举____笔记的主要内容,如果未能解决你的问题,请参考以下文章
20160402_[转]联合体(union)的使用方法及其本质