zoukankan      html  css  js  c++  java
  • 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. 参阅了网上许多小道的内容,这个记不得了。。抱歉抱歉!!吐舌笑脸

  • 相关阅读:
    设计模式之访问者模式
    设计模式之命令模式
    设计模式之迭代器模式
    tomcat8.0.11性能优化
    java 基础 --集合--012
    StringBuffer和StringBuilder的区别
    jquery 入门
    java 基础 --匿名内部类-008
    java 基础 --多态--009
    java 基础--继承--007
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8533240.html
Copyright © 2011-2022 走看看