(一)基本概念

结构体是一个或是多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组合在一个名字之下。我们将关键字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. 参阅了网上许多小道的内容,这个记不得了。。抱歉抱歉!!

struct 结构体解析(原)的更多相关文章

  1. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

  2. C#基础--struct(结构体)

    结构体和类有点类似    我们定义一个类的时候    是class   类名   定义结构体的时候是 struct   结构体名 结构体的写法 struct Point { // public int ...

  3. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  4. C#语言struct结构体适用场景和注意事项

    在C#语言中struct结构体和class之间的区别主要是值类型和引用类型的区别,但实际上如果使用不当是非常要命的.从Win32时代过来的人对于struct一点不感觉陌生,但是却反而忽略了一些基本问题 ...

  5. C语言 Struct 结构体在 Java 中的体现

    大一整个学期完成了 C 语言的学习,大二就进入了Java 的学习. 和C语言一样,我们都会尝试写一个小小的学生管理系统什么的,学习过 C 语言同学知道,在管理系统中 Struct 结构体是个很好用的东 ...

  6. Swift Struct 结构体

    前言 Swift 语言有两种基本的数据类型,即类(class)和结构体(struct),class 这样的概念大家不会陌生,而 struct 也并不是什么新的概念,在 Objective-C 和 C ...

  7. go struct结构体

    struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性),字段可以是任意类型 struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以 ...

  8. struct结构体在c和c++中的差别

    非常多次遇到这个struct的问题,今天在这里简单总结一下我的理解 一.struct在C 中的使用 1.单独使用struct定义结构体类型 struct Student { int id; int n ...

  9. Go - Struct 结构体

    目录 概述 声明结构体 生成 JSON 改变数据 推荐阅读 概述 结构体是将零个或多个任意类型的变量,组合在一起的聚合数据类型,也可以看做是数据的集合. 声明结构体 //demo_11.go pack ...

随机推荐

  1. Codeforces Gym 100286I iSharp 模拟

    原题地址:http://codeforces.com/gym/100286/attachments/download/2013/20082009-acmicpc-northeastern-europe ...

  2. 在Oracle Linux上安装dtrace

    http://www.ohsdba.cn/index.php?g=Home&m=Article&a=show&id=171   时间: 2016-10-09 00:40:04 ...

  3. LayUI后台管理与综合示例

    一.LayUI介绍 layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体 ...

  4. SolidEdge 工程图中如何快速将同一类元素放到同一个图层

    在图层选项卡中新建一个尺寸线图层   点击聪慧选项(把它点凹下去),然后点击任意尺寸线,弹出聪慧选取选项,点击确定,则自动选择了所有尺寸线   点击移动图元,把刚才选中的所有尺寸线都移动到这个图层即可 ...

  5. 基本SQL 语句操作数据增删查改

    1.创建数据库: create database <数据库名>. 如:create database student; 2.连接到一个已经存在的数据库: use <数据库名>: ...

  6. asp.net mvc 性能优化——(1)静态化

    asp.net mvc 性能优化--(1)静态化 在改善页面性能的同时,可能会采用静态化的策略,对于不能实时静态化的内容,则采用缓存.本文主要讨论如何实现cshtml的静态化(实际上还不是完全的htm ...

  7. iOS文件的管理(添加,删除,拷贝,移动)

    #import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super vie ...

  8. 【转】DevOps原则

    DevOps的出现有其必然性.在软件开发生命周期中,遇到了两次瓶颈. 第一次瓶颈是在需求阶段和开发阶段之间,针对不断变化的需求,对软件开发者提出了高要求,后来出现了敏捷方法论,强调适应需求.快速迭代. ...

  9. 【转载】关于Hash

    这个HASH算法不是大学里数据结构课里那个HASH表的算法.这里的HASH算法是密码学的基础,比较常用的有MD5和SHA,最重要的两条性质,就是不可逆和无冲突.所谓不可逆,就是当你知道x的HASH值, ...

  10. 在线API

    JExcelApi http://jexcelapi.sourceforge.net/resources/javadocs/index.html Poi http://poi.apache.org/a ...