结构体

Posted zhengmengen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体相关的知识,希望对你有一定的参考价值。

1、易错点

struct {
   int       a;
   float     b;
   double    c; 
}x;

struct {
   int       a;
   float     b;
   double    c; 
}y[20],*z;

直接用结构体创建的变量,只要不是在一个地方创建的,就被编译器当成不同的类型,所以尽管x,y,z的成员完全一样,但无法使用x对y或者z进行赋值。(就像不能把int型赋值给float一样)

 

2、结构体标签

用结构体标签创建的变量,类型相同,可彼此赋值。

struct SIMPLE{
   int       a;
   float     b;
   double    c; 
};
struct SIMPLE x;

typedef struct {
   int       a;
   float     b;
   double    c; 
}Simple;
Simple y;

SIMPLE是结构体标签,标签一般用全大写。而Simple是一个结构体SIMPLE的别名,用其创建变量代码量相对少些。

struct SIMPLE *cp; //声明一个指向SIMPLE结构体变量的指针
(*cp).a=5;  //修改该结构体变量中成员a的值
cp->a=7;    //再次修改a的值

 

3、位段

可以用结构来实现位段(bit field),位段的声明和结构体类似,但他的成员是一个或多个位的字段(以位为单位),这些可能不同位数的字段成员可以存储于一个或多个整型变量中。

struct CHAR{
unsigned ch      : 7;    //成员的类型只能是int、signed int、unsigned int
unsigned font    : 6;     //成员后面是一个冒号和一个整数,该整数指定该成员所占位数
unsigned size    : 19;
};
struct CHAR ch1;

位段能实现的任务都能通过移位和屏蔽来实现,但位段的源代码明显比后者简单很多,但是,位段的可移植性较差,可移植的程序应尽量避免使用位段。原因在于:

①若位段使用int声明成员,则该成员究竟被译成有符号还是无符号是由编译器决定的;

②位段成员的长度一般都会限制在一个整型值内,所以一个在32位机器上声明并运行的程序可能无法在16位机器上使用;

③位段成员在内存中是从左向右分配还是从右向左分配也具有较强的机器依赖性;

 

4、联合  union

fd联合的声明方式和结构体类似。但是,联合和结构体有很大不同。

union{
float   f;
int      g;    
}fi;//变量fi有两个成员f和g,二者使用同一段内存,不同的成员可以理解成对该段内存的不同解释

 

5、枚举类型  enum

枚举类型的值为符号常量而不是字面值。

enum Jar_Type{CUP,PINT,QUART,HALF_GALLON,GALLON}//声明一个类型,类型名为Jar_Type
enum Jar_Type milk_jug,gas_can,medicine_bottle;//声明几个该类型的变量
enum Jar_Type{CUP,PINT,QUART,HALF_GALLON,GALLON}milk_jug,gas_can,medicine_bottle;//另一种变量声明方式
//枚举类型的变量实际上以整型的方式存储,所列举符合的实际值都是整数值。比如CUP是0,PINT是1
enum Jar_Type(CUP=8,PINT,QUART=32,HALF_GALLON=64)
//PINT的整型值未明确赋予,默认为前一个的值加1

枚举类型的变量实际上以整型的方式存储,所列举符合的实际值都是整数值

 

详见:http://blog.sina.com.cn/s/blog_817a5eb6010146ad.html

以上是关于结构体的主要内容,如果未能解决你的问题,请参考以下文章

在C代码中将结构体变量作为参数传递效率忒低

如何优化C ++代码的以下片段 - 卷中的零交叉

20160221.CCPP体系详解(0031天)

Golang PrintfSprintf Fprintf 格式化

Go 系列教程 —— 17. 方法

VSCode自定义代码片段5——HTML元素结构