struct 结构体解析(原)

简介:

(一)基本概念

    结构体是一个或是多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组合在一个名字之下。我们将关键字struct引入了结构声明中。结构声明包含在花括号内的一系列声明组成。例如:

// 以下是一个巨普通的结构体,表示坐标。
// point 为结构标记;x, y为成员。
struct point
{
    int x;
    int y;
};
 
// 以下是跟变量表的情形
struct point
{
    int x;
    int y;
}px, py, pz;
 

(二)使用方法

1. 初始化方法

    (1) 结构体变量的初始化方式分别给结构体的成员变量以初始值.

具体的形式如下:

struct 结构体标识符
{
成员变量列表;
};
第一种初始化:
struct 结构体标识符 变量名 = {初始化值1,初始化值2,…, 初始化值n };
 
struct point impl = {100, 200};
 
第二种初始化:
struct 结构体标识符 变量名;
变量名.成员 = 值;
 
struct point impl;
impl.x = 100;
impl.y = 200;
 
第三种初始化方法:
struct 结构体标识符
{
成员变量列表;
}变量名 = {初始化值1,初始化值2,…, 初始化值n };
 
struct point
{
    int x;
    int y;
}impl = {100, 200};
 

对于结构体内还有结构体的形式,可以用以下的方式来解决:

struct rect
{
    struct point pt1;
    struct point pt2;
};
第一种初始化方法:
struct rect rect_impl;
rect_impl.pt1.x = 100;
 
第二种初始化方法:
struct rect
{
    struct point pt1;
    struct point pt2;
}rect_impl = {
    {100, 200},
    {300, 400}
};
 

2. 结构体与指针

    结构与指针其实密不可分,在函数的返回和调用中,我们不能用复制整个结构体的方式,因为这样的效率实在是太低了。谁都不希望将一个大象抗在身上,然后到处跑!幽灵

    这个时候,指针出现了。就像救世主出现在人间,赶走了大象,留下了羽毛。

以下是实现形式:

struct point *ppt, origin;
origin.x = 100;
origin.y = 200;
 
ppt = &origin;    // 将origin的地址传给ppt
// 以下是结构体指针的两种调用形式
std::cout << (*ppt).x << std::endl;    // 100
std::cout << ppt->x << std::endl;      // 100
 
// 对于函数的调用
struct point *func(struct point *, int x){}

3. 结构体与数组,链表

   如果说当个结构体个体只是一块板砖的话,那么与数组结合,就是一堆板砖啊!悄悄话我们常使用数组来储存一些东西,这些东东看重的数组的线性结构。当然,如果结构体内部有结构体指针,那么我们可以来组链表。线性结构的关键在于查找时的时间损耗,O(1)是许多人追求的梦想。而链表的容量巨大,只要你内存够大,它就能让你欲罢不能捧腹大笑!鱼和熊掌不能兼得,O(n)时间的损耗是你要权衡的。

以下是数组太阳实现形式:

// 结构体与数组
// 第一种实现形式:
struct point
{
    int x;
    int y;
}pta[] = {
    2, 2,
    3, 3,
    4, 3
};
 
// 第二种实现形式:
struct point
{
    int x;
    int y;
};
 
struct point pta[10];    // 定义了10个point
pta[1].x = 100;

以下是链表太阳的形式:

// 二叉树的链式结构
typedef struct tNode
{
    int Elem;
    struct tNode *LChild;
    struct tNode *RChild;
}*BiTree;
 
// 构造二叉树的方法
// 构造一棵空的二叉树
void InitBiTree(BiTree &BIT)
{
    if (!(BIT = (BiTree)malloc(sizeof(tNode)))){exit(1);}
    BIT->LChild = NULL;    // 左子树为空
    BIT->RChild = NULL;    // 右子树为空
}

4. 结构体与typedef

    typedef用来建立新的数据类型名。以下用代码来解释:

// 二叉树的链式结构
typedef struct tNode
{
    Data_Type_BiTR Elem;
    struct tNode *LChild;
    struct tNode *RChild;
}*BiTree;
 
// 也可用下面的方式
struct tNode
{
    Data_Type_BiTR Elem;
    struct tNode *LChild;
    struct tNode *RChild;
};
 
typedef struct tNode *BiTree;
 
// 以上两种效果都一样

 

    其实,typedef没有创建新的类型。只是增加了一个新的名词而已。这样做的好处有倆大笑:首先呢,程序参数化,提高移植性。其次,就是好改啦,改一个地方就可以影响所有的地方了。

 

参考文献

1.《C++ primer》和《C语言程序设计》

2. 参阅了网上许多小道的内容,这个记不得了。。抱歉抱歉!!吐舌笑脸

目录
相关文章
|
10月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
819 14
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
结构体\判断日期是否合法(代码分步解析)
结构体\判断日期是否合法(代码分步解析)
132 1
|
存储 搜索推荐 编译器
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
223 1
|
存储 编译器 Linux
解析编程中不可或缺的基础:深入了解结构体类型
解析编程中不可或缺的基础:深入了解结构体类型
122 1
|
存储 网络协议 编译器
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
216 1
|
存储 程序员 数据处理
C语言中的结构体:深入解析与应用
C语言中的结构体:深入解析与应用
224 0
|
7月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
718 29
|
7月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
214 4
|
7月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS