深入分析C/C++ 结构体定义及应用

电子说

1.3w人已加入

描述

1 结构声明结构声明描述了一个结构的组织布局。举例如下:

struct tempA

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

};

下边依次对此结构进行解析:

1、struct

struct 是一个关键字,表明跟在其后的是一个结构;

2、tempA

tempA 是一个 可选的标记 ,但是在上述例子中,不能去掉,否则该结构没有作用的 “对象” ,不过可写成如下样式:

struct

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

}tempB;

tempA 这个标记,写与不写,主要有以下区别:

1、写了此标记,则可以在后续程序中使用此标记来引用该结构;

struct tempA book; // C 写法// C++允许在声明结构变量时,省略关键字struct

tempA book; // C++ 写法

2、如果不写此标记,则只引用该结构定义了一个变量,也就是一次性的,如果需要定义另外一个拥有相同元素的结构体变量,必须要全部重新再写一遍,不能直接引用 tempB 。

2 定义结构变量结构有两层含义,一层是 “结构布局” ,就是上边的结构声明。结构布局告诉编译器如何表示数据,但是它并未让编译器为数据分配空间(待确认,看参考的经验,利用 sizeof 还是有空间的)。

下一步是创建一个结构变量, 即是结构的另外一层含义,前边也有提到过,程序中实现如下:

struct tempA book; // C 写法

tempA book; // C++ 写法

但是如果打算多次使用此结构,就要使用带标记的形式,也就是必须要写 tempA ;或使用 typedef ,下边将讲一下 typedef 的用法。

3 typedef个人建议使用 typedef 时,把标记也写上,这样在 C 中,可以使用 typedef 定义的类型(tempB),在 C++ 中可以直接使用标记(tempA)。两个名字应该是不能一样的。

typedef struct tempA

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

}tempB;

使用 typedef 的好处有如下两点:

1、为经常出现的类型创建一个方便,易识别的类型名。

2、typedef 常用于给复杂的类型命名。

4 常见方法举例4.1 未用typedef先声明结构体类型,再定义结构变量

struct tempA

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

};

struct tempA book; // C 写法

tempA book; // C++ 写法

在声明类型的同时,定义结构变量

struct tempA

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

}book;

直接定义结构体类型变量(没有标记)

struct

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

}book;

4.2 使用typedef直接定义结构体变量,没有标记,但是可以使用此变量引用该结构体

typedef struct

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

}tempB;

tempB book; // C C++ 均可

推荐此方法,即定义标记,又定义结构体变量

typedef struct tempA

{

char cvariableA; // char 类型的变量 cvariableA

int ivariableB; // int 类型的变量 ivariableB

float fvariableC; // float 类型的变量 fvariableC

char carrayA; // char 类型的数组 carrayA

}tempB;

此时如果使用 C ,则可以使用 tempB ;如果使用 C++ ,则可以使用 tempA 或 tempB 。

5 总结除了上边讲的,还有一些其他的结构体初始化,结构体里边定义结构体等内容。但万变不离其宗,都可以参考文章开头的网址,里边讲的比较详细。这里只是简单做个总结。

后续我也会按文中推荐的标准来使用(用 typedef ,标记和结构变量都要),这样兼容性比较好,也使自己的代码有比较统一的风格。

编辑:jq

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分