32.【C/C++ 结构体全类型 (详解)】(一)

简介: 32.【C/C++ 结构体全类型 (详解)】

(一)、什么是结构体?

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员”,其描述了一块内存区间的大小及解释意义

(二)、结构体的声明:

#include <iostream>
using namespace std;
//结果提声明
struct book
{
  int a;
  float b;
};   //这里有一个分号
int main()
{
}

这个声明描述了一个整型变量和一个float变量组成的结构体,但是注意,他并没有创建一个实际的数据对象,而是描述了一个组成这类对象的元素,【因此,我们也有时候将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象】。

2.1介绍一下上面的结构体声明;

1,首先使用**关键字struct**,他表示接下来是一个结构体。
2;后面是一个**可选的标志**(book),它是用来引用该结构体的快速标记。
因此我们    以后就会可以这样创建数据对象
struct book library;//把library设为一个可以使用book结构体
的结构体变量,则library这个变量就包含了其book结构体中的所有元素
3;接下来就是一个**花括号**,括起了结构体成员列表,及就是每个成员变量,
使用的都是其自己的声明方式来描述,用分号来结束描述;
  列如;int a,字符数组就是这样声明的,用分号结束;

注意;其中每个成员可以使用任何一种c数据结构甚至是其他的结构体,也是可以的;

4;在结束花括号后的**分号**表示结构体设计定义 的结束。

2.2struct声明的位置

关于其struct声明的位置,也就是这段代码要放到哪里。同样这也是具有作用域的。

这种声明如果放在任何函数的外面,那么则可选标记可以在本文件中,
该声明的后面的所有函数都可以使用。如果这种声明在某个函数的内部,
则它的标记只能咋内部使用,并且在其声明之后;

2.3标记名的可省略性

关于我们不断说的,标记名是可选的,那么我们什么时候可以省略,什么时候一定不能省略呢?

不能省略的情况是:如果是上面那种声明定义的方法,并且想在一个地方定义结构体设计,而在其他地方定义实际的结构体变量那么就必须使用标记;

可以省略的情况是:设计的同时就创建该结构体变量,但是这种设计是一次性的,还有就是引入typedef。

第一种:

注意这里不再是定义声明结构体类型,而是直接创建结构体变量了,这个编译器会分配内存的;

这样的确可以省略标识符也就是结构体名,但是只能使用一次;因为这是;声明结构体的过程和定义结构体变量的过程和在了一起;并且个成员变量没有初始化的;

如果你想多次使用一个结构体模块,这样子是行不通的;

struct
{
    char title[MAXTITL]; 
    char author[MAXAUTL];
    float value; 
}library;

第二种:

用typedef定义新类型名来代替已有类型名,即给已有类型重新命名; 一般格式为;typedef 已有类型 新类型名;

typedef int Elem; 
typedef struct{
    int date;
    .....
    .....
}STUDENT;
STUDENT stu1,stu2;
关于结构体类型的定义的总结;
一般格式就是;
struct 结构体名(也就是可选标记名)
{
    成员变量;
};//使用分号表示定义结束;

(三)、结构体变量的定义

3.1分配空间

之前我们结构体类型的定义(结构体的声明)只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。我们要使用结构体,那么就需要创建变量,也就是结构体变量;

注意: 结构体变量不等于成员变量

创建一个结构体变量;struct book library;

看到这条指令,编译器才会创建一个结构体变量library,此时编译器才会按照book模板为该变量分配内存空间,并且这里存储空间都是以这个变量结合在一起的,这也是后面访问结构体变量成员的时候,我们就要用到结构体变量名来访问。

3.2对结构体和结构体变量的分析:

struct book的作用;在结构体声明中,struct book所起到的作用就像int/、float、char等基础数据类型名作用一样。

struct book s1,s2,*ss;

定义两个struct book结构体类型的结构体变量,还定义了一个指向该结构体的指针,其ss指针可以指向s1,s2,或者任何其他的book结构体变量。

其实:
struct book library;
等效于:
struct book{
char …
….
…..
}librar;

这两种是等效的,只是第一种可以减少代码的编写量;

3.3总结:

3.3.1:先定义结构体类型后再定义结构体变量;

格式为;struct 结构体名 变量名列表; struct book s1,s2,*ss;

注意这种之前要先定义结构体类型后再定义变量;

3.3.2;在定义结构体类型的同时定义结构体变量
格式为; struct 结构体名 { 成员列表; }变量名列
这里结构体名是可以省的,但尽量别省;
struct book {
    char title[MAXTITL];//一个字符串表示的titile 题目 ; 
    char author[MAXAUTL];//一个字符串表示的author作者 ; 
    float value;//一个浮点型表示的value价格; }s1,s2;   
3.3.3直接定义结构体类型变量.

就是第二种中省略结构体名的情况; 这种方式不能指明结构体类型名而是直接定义结构体变量,并且在值定义一次结构体变量时适用,无结构体名的结构体类型是无法重复使用的,也就是说,后面程序不能再定义此类型变量了,除非再写一次重复的struct落、


相关文章
|
3月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
39 0
|
1月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
32 11
|
2月前
|
存储 算法 C++
【C++核心】结构体、共用体详解
这篇文章详细讲解了C++中结构体和共用体的概念、定义、使用场景和案例,包括结构体的创建、数组、指针、嵌套、函数参数传递,以及共用体的特点和应用实例。
28 4
|
2月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
2月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
3月前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
56 0
|
4月前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
38 6
|
3月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
40 0
|
4月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector&lt;std::shared_ptr&lt;int&gt;&gt;;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
68 5
|
3月前
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
38 0