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

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

(四)、结构体变量的初始化

1.回忆一下普通变量的初始化

2.结构体变量的整体初始化(顺序要一致)

关于结构体变量的初始化与初始化数组类似;

也是使用花括号括起来,用逗号分隔的初始化好项目列表,

注意每个初始化项目必须要和要初始化的结构体成员类型想匹配,

注意如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了;

意思就是;

/这样是可以的,在定义变量的时候就初始化了;
struct book s1={//对结构体初始化 
        "guojiajiaoyun",//author为字符数组 
          "yuwen",//title为字符串 
          22.5
    };
/这种就不行了,在定义变量之后,若再要对变量的成员赋值,那么只能单个赋值了;
struct book s1;
    s1={ 
         "guojiajiaoyun",//author为字符数组 
          "yuwen",//title为字符串 
          22.5  
    };//这样就是不行的,只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值;
    只能;
    s1.title = "yuwen";........//单个赋值;
3.结构体的个别初始化(可乱序)

(五)、访问结构体成员变量

5.1什么是结构体成员变量

结构体就像一个超级数组,在这个超级数组内,一个元素可以是char类型,下个元素就可以是flaot类型,再下个还可以是int数组型,这些都是存在的。

第一种:用结构成员运算符点(.)

结构体变量名.成员名;

注意,点其结合性是自左至右的,它在所有的运算符中优先级是最高的;

5.2结构体内嵌结构体怎么访问

结构体变量名.成员.子成员………最低一级子成员;

struct date
{
    int year;
    int month;
    int day;
};
struct student
{
    char name[10];
    struct date birthday;
}student1;

若想引用student的出生年月日,可表示为;student.brithday.year

brithday是student的成员;year是brithday的成员;

5.3结构体变量可以整体赋值但必须分开输入输出

1.可以整体赋值:

可以将一个结构体变量作为一个整体赋值给另一相同类型的结构体变量,可以到达整体赋值的效果;这个成员变量的值都将全部整体赋值给另外一个变量;

2.必须分开输出:

可以将一个结构体变量作为一个整体赋值给另一相同类型的结构体变量,可以到达整体赋值的效果;这个成员变量的值都将全部整体赋值给另外一个变量;

总结;除了“相同类型的结构体变量可以相互整体赋值”外,其他情况下,不能整体引用,只能对各个成员分别引用;

(六)、结构体数组:

1.为什么要用结构体数组呢/

在上面的book类型的结构体 ,每本书就需要用一个book类型的结构体变量来描述,若是要描述两本书,需要使用两个这样的变量,依次类推;因此要使用一个该结构体的数组,来表示这些图书;并且数组就是存储一组具有相同类型的数据,因此就有了结构体数组的出现.

2.声明结构体数组

与普通的数组声明一样,int a[10];int为元素的数据类型,a为数组名 【10】表示申请了10的int单元的内存;

再看结构体声明;struct book library[10];是不是类似,struct book为数组元素的数据类型,library为数组名,[10]为申请了10个struct book单元的内存;

解释;声明library为一个具体10个元素的数组,并且每个元素都book类型的结构,因此可以得到library[0],library[1]…….都是单独独立的一个book结构;

注意library本身不是结构体名而是一个数组名;

3.结构体数组的初始化

4.访问结构体数组的成员:

规则;在结构体名后加点运算符,然后再是成员名;

library[5].title;//表示第5个元素的title成员;library[5]是结构体变量名,title就是成员名;

library[5].titlt[4];//注意title是数组类型,第5个数组元素的title成员的第4个字符;

总结;

library //book结构体的数组
library[2]//数组的第二个元素,一个book结构体类型的变量名;
library[2].title;//char数组,结构体数组的第二个元素的title成员;
library[2].title[4];//表示一个字符,结构体数组的第二个元素的
title成员的第四个字符;

(七)、指向结构体的指针

1.使用结构体指针的好处:

就像指向数组的指针一样,它比数组本身更容易操作,指向结构体的指针通常也比结构体本身更容易操作;

2.声明和初始化结构体的指针

声明struct book * him;

规则就是,struct 结构体名+ * + 指针名;

这个声明不是建立一个新的结构体,而是创建了一个指针类型的him指针变量,他可以指向任何现有的book类型的结构体;

him = &library[0];

怎么访问成员?

方法一:

引入一个运算符,-> 后跟->运算符的结构体指针和后跟.点运算符的结构体名是一样操作的;

注意一点的是;不能使用him.成圆;因为him不是结构体名;

方法二;

如果him=&library[0],那么him=library[0];因为&和是一个互逆的运算符; &取地址,*取值;

=》library[0].value 等价于 (*him).value;注意必须使用圆括号,优先级问题; 然后都与him.value是一个作用;

如有问题可直接私聊博主!!!!!

相关文章
|
1月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
32 0
|
3天前
|
存储 算法 C++
【C++核心】结构体、共用体详解
这篇文章详细讲解了C++中结构体和共用体的概念、定义、使用场景和案例,包括结构体的创建、数组、指针、嵌套、函数参数传递,以及共用体的特点和应用实例。
13 4
|
24天前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
30天前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
28 0
|
1月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
31 0
|
2月前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
32 6
|
2月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
53 11
|
2月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector<std::shared_ptr<int>>;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
56 5
|
1月前
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
26 0
|
1月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
34 0