struct 理解 (需要经常理解)
2014.3.11
分析offviewer时,有一些问题,很基础的,但是忘记了,发现问题那就快点搞定它
以下内容参考自百度百科:
(2)struct 结构体有点忘记了,要复习一下
在这个结构定义中,结构名为stu,该结构由4个成员组成。 第一个成员为num,整型变量;第二个成员为name,字符型数组;第三个成员为sex,字符型变量;第四个成员为score,浮点型变量。 应注意在括号后的分号是必不可少的。
在C++中,struct的功能得到了强化,struct不仅可以添加成员变量,还可以添加成员函数,和class类似
结构定义之后,即可进行变量说明。 凡说明为结构stu的变量都由上述4个成员组成。由此可见, 结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。
对齐方式编辑
默认的对齐方式
字节的对齐方式
(一)基本概念
结构体是一个或是多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组合在一个名字之下。我们将关键字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没有创建新的类型。只是增加了一个新的名词而已。这样做的好处有倆
:首先呢,程序参数化,提高移植性。其次,就是好改啦,改一个地方就可以影响所有的地方了。
struct 理解 (需要经常理解)的更多相关文章
- C分配struct变量一个不理解的地方
- java 继承多态的一些理解不和不理解
1.向上转型的一个误区 一直以为Child 继承Parent以后, Parent p = new Child(); p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才 ...
- 通过回调函数的理解来进一步理解ajax及其注意的用法
一,再一次理解回调函数 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opaci ...
- httpclient的理解(代码理解)
一,httpclient的理解 httpcliet就是模仿浏览器在服务器内部从一个项目调用另一个项目的技术.比如说调用接口等. HttpClient 是 Apache Jakarta Common ...
- python3 变量理解 解释器理解 常量理解 用户交互理解 逻辑运算
先来条NLP再说...... 九,每人都已经具备使自己快乐的资源 每一个人都有过成功快乐的体验,也即是说有使自己快乐的能力. 人类只用了大脑能力极少部分,提升大脑的运用,很多新的突破便会出现. 运用大 ...
- 对stm32寄存器的理解(个人理解,大神轻喷)
学习了stm32有一年了,今天想来写写自己对寄存器的理解,帮助那些有志学习stm32的朋友们少走一些弯路. ---------------------------------------------- ...
- java 继承多态的一些理解和不理解
1.向上转型的一个误区 一直以为Child 继承Parent以后, Parent p = new Child(); p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才 ...
- 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法
self是什么,就是一个函数,就是一个形式参数 4.self就是调用当前方法的对象 静态字段,公有属性 静态字段使用场景,每个对象中保存相同的东西时,可以使用静态字段,公有属性 5.封装的理解 类中封 ...
- 机器学习:PCA(基础理解、降维理解)
PCA(Principal Component Analysis) 一.指导思想 降维是实现数据优化的手段,主成分分析(PCA)是实现降维的手段: 降维是在训练算法模型前对数据集进行处理,会丢失信息. ...
- 关于多态的理解,有助于理解TStream抽象类的多态机制。
有的时候 不是很明白流的机制,因为有内存流 文件流 图片流 等等 他们之间的相互转化 靠的就是流的多态性.... unit Unit11; interface uses Winapi.Windows ...
随机推荐
- ES5 vs ES6
ES5中 var React = require('react-native'); ES6中 import React from 'react-native'; .babelrc文件中添加一下内容 { ...
- Entity Framework学习笔记(四)----Linq查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...
- Labview实现脉波调制( PDM )
Labview实现脉波调制( PDM ) 根据定义为脉冲宽度调制 生成一个正弦信号,得到其幅值输入给一个方波信号的占空比 由于方波信号的占空比里面含有正弦信号的信息 因此通过滤出方波信号的占空比信息则 ...
- C语言函数返回数组
#include "stdio.h"/*int* set(int a,int *c){ int *b; b=malloc(sizeof(int)*3); c[0]=a; c[1]= ...
- 修改ptrace_scope
需要将kernel.yama.ptrace_scope=1 改为kernel.yama.ptrace_scope=0 文件位于/etc/sysctl.d/目录下 修改后需要用sysctl -p /et ...
- Linux设置:环境变量
一.在相关配置文件中添加可执行文件/头文件/静态库/动态库的搜索路径 对所有用户有效在/etc/profile添加. 只对当前用户有效在Home目录下的.bashrc或.bash_profile里添加 ...
- python解析xml之lxml
虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...
- 使用 NIO.2 遍历目录下所有的Java文件
package wellGrounded; import java.io.IOException; import java.nio.file.FileVisitResult; import java. ...
- 【bzoj1013】[JSOI2008]球形空间产生器sphere
1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4530 Solved: 2364[Subm ...
- fpu栈溢出
老大们遇到个问题,有一堆浮点数运算,分开写就对,合一起就溢出. 是因为定义的函数返回float的时候,别的地方声明是void错了,这样的错误累计八次之后,浮点数寄存器就满了.没地方放就错了. 函数前面 ...