关于结构体的具体解说,C、C++中的差别
1.
C、C++内置的类型分两种,一种是基本数据类型。一种是复合数据类型。此处我们要讲的结构体便是复合数据类型。先来讨论一下结构体存在的意义吧。或许你觉得主要的数据类型就够了,为什么还要有结构题这样的复合数据类型存在呢?事实上结构体是非常实用的。
2.
比方当我们要存储以为老师的基本信息时,则可能须要存储他的姓名、身高、工资、体重、家庭住址等等。我们希望有一种数据格式能够将全部这些信息存储在一个单元中。数组肯定是不能完毕这项艰巨的任务的,由于数组尽管能够存储多个元素。但全部元素的类型必须同样,比方,一个数组能够存储20个int类型的元素,另外一个数组能够存储20个double型的元素。可是我们是不能够在一个数组中一部分元素存储20个int,一部分元素用来存储20个double。这也就是数组相对于结构体的缺陷。3.
C++中的结构体便能够满足存储一位老师基本信息的要需求。结构体是一种币数组更灵活的数据格式。由于同一个结构体能够存储多种类型的数据,这使得我们能够将老师的基本信息存放在一个结构体中从而将数据的表示合并到一起。结构体事实上也是C++面向对象的一个基础。
结构体是用户自定义的类型。定义了这样的类型之后。便能够创建结构体变量了(此处或许说成是对象,对理解OOP的帮助更大)。
使用结构体的两个步骤:
A.
定义结构体
B.
创建结构体变量以下我们创建一个描写叙述一个结构体:
struct worker
{
char name[20];
int age;
double salary;
};struct 是创建结构体的keyword。表明以下将创建的是一个结构体,worker是结构体的名字,此时我们便能够像创建int类型的变量那样创建结构体变量了。
worker tom;
worker Bob;
假设大家对C语言还有映像的话,可能会注意到,此处我创建的两个worker类型的对象时,没有加keywordstruct,这里便是C++做的一点改进,这样让我们创建结构体对象时和创建类的对象更加相似了。(注意:C语言创建结构体对象不能省略structkeyword)。
结构体成员的訪问是使用“.”成员运算符来实现的,比如此处,我们能够这样訪问结构体成员,tom.name。Bob.salary。(tom是一个结构体对象,而tom.name是一个char类型的变量。注意这点差别)。
值得一说的是。訪问类成员函数如cin.get()的方法是从訪问结构体变量的方法衍生而来的。
(学语言事实上能够学一下语言的发展史)。
4.以下来举一个结构体使用的实例吧
代码例如以下:
// struct.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
struct worker
{
char name[20];
int age;
};
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std; worker wor1 =
{
"manTom",
28
}; worker wor2 = { "womenBob", 30 };
cout << "The first worker's name: "
<< wor1.name
<< " age: "
<< wor1.age
<< endl;
cout << "The second worker's name: " << wor2.name << " age: " << wor2.age << endl; cout <<"sum of age:"<< wor1.age + wor2.age << endl;
system("pause");
return 0;
}执行截图例如以下:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:14px">
5.结构体的声明能够放在两个位置:
放在main()函数的前面。此时叫外部声明。能够被其后面的全部函数使用。
放在main()函数中,此时仅仅能被该声明所属的函数使用。
通常还是使用外部声明,这样全部的函数都能够使用这样的类型的结构体。
6.结构体的初始化
C++11做了非常大的改进,跟数组一样,结构体变量也能够使用花括号“{}”来初始化。
Worker wor1{“tom”,28};当然也能够加上等号。这样写Worker wor1={“tom”,28};
只是我相信大家肯定是最喜欢偷懒的写法吧。
注意:假设花括号内没有包括不论什么东西。那么各个成员都将被设置为0。
Wor1.age的值被设置为0。而wor1.name的每一个字节都被设置为0。
7.可能学的深入的朋友另一个疑问,string类能够作为结构体的成员吗?
当然答案是yes
比如你能够像以下这样定义结构体。
struct worker
{
std::string name; //此处你也能够先指出命名空间。
int age;
}8.以下再讲一讲结构体的值传递。
大家可能都知道基本数据类型之间的赋值,比如:
Int a=10;
int b;
b=a;
这样b的值也就是10了。非常是方便,可是结构体能够这样赋值吗,比如能够将bob的值赋给tom吗?tom=bob。
以下举个样例:
代码例如以下:
// struct.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
struct worker
{
char name[20];
int age;
};
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std; worker wor1 =
{
"manTom",
28
};
worker wor2;
cout << "The first worker's name: "
<< wor1.name
<< " age: "
<< wor1.age
<< endl;
wor2 = wor1;
cout << "The second worker's name: " << wor2.name << " age: " << wor2.age << endl; cout <<"sum of age:"<< wor1.age + wor2.age << endl;
system("pause");
return 0;
}执行截图:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
从上面能够看出,结构体对象之间是能够直接赋值的。
9.最后再说一下结构体数组。结构体数组就是元素为结构体变量的数组。
创建方法和创建基本类型的数组方法一模一样。
比如要创建一个包括50个worker的数组。能够这样:
Worker wor[50];
Wor是一个worker数组。当中每一个元素都是worker对象,能够和成员运算符一起使用。
比如:
Cin>>wor[0].name。
Cout<<wor[0].name;
注意:wor是一个数组,而不是结构体。
结构体数组初始化方法:
worker wor[2]={{“tom”,20},{“bob”,30}};
以下举个样例:
代码例如以下:
// struct.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
struct worker
{
char name[20];
int age;
};
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
worker wor[2]=
{
{"tom",20},
{"bob",30}
};
cout << "The first worker's name: "
<< wor[0].name
<< " age: "
<< wor[0].age
<< endl; cout << "The second worker's name: " << wor[1].name << " age: " << wor[1].age << endl; cout <<"sum of age:"<< wor[0].age + wor[1].age << endl;
system("pause");
return 0;
}执行截图例如以下:
10.最最后再说一下结构体中的位字段。
与C语言一样,C++同意指定占用特定位数的结构体成员,这使得创建与某个硬件设备上的寄存器相应的数据结构很方便,学硬件的朋友可能深有体会。
以下举个样例:
Struct torgle_register
{
unsigned int SN : 4;
unsigned int : 4;
bool goodIn : 1;
bool goodTorgle : 1;
};位字段通经常使用在底层的编程中。
好了,关于结构体的知识大概就讲到这里了。
注:程序中给出的代码都在VS2013中通过编译执行。
关于结构体的具体解说,C、C++中的差别的更多相关文章
- 在C的头文件中定义的结构体,如何在cpp文件中引用
解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dia ...
- C++ 结构体案例2 升序打印数组中的元素
1 //结构体案例 2 2 #include<iostream> 3 #include<string> 4 #include<ctime> 5 using name ...
- p/invoke碎片,对结构体的处理
结构体的一些相关知识 可直接转换类类型,比如int类型,在托管代码和非托管代码中占据内存大小 和意义都是一个样的. 结构体封送的关键是:在托管代码和非托管代码中定义的一致性.什么是定义的一致性?包括结 ...
- 结构体struts的长度
在需要计算结构体大小的时候,涉及到的一个问题就是其对齐模数 计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐,而 ...
- 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承
1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum Celebrity{ case DongXie,XiDu,Nandi,BeiGai } // 从左 ...
- 结构体struct 与 联合union
1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{ //struct为关键字,“结构体名”为用户定义的类型标识. ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- C结构体中数据的内存对齐问题
转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...
- socket编程相关的结构体和字节序转换、IP、PORT转换函数
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...
随机推荐
- IRQ中断处理流程
基于Linux2.6.30.4分析IRQ中断的处理流程. 1.中断入口 /* arch/arm/kenel/entry-armv.S*/ b vector_irq + stubs_offset 2.v ...
- 【笔记】PIL 中的 Image 模块
Image 模块提供了一个同名类(Image),也提供了一些工厂函数,包括从文件中载入图片和创建新图片.例如,以下的脚本先载入一幅图片,将它旋转 45 度角,并显示出来: 1 >>> ...
- Bin Paking Problem:简单的构造性算法
*本文主要记录和分享学习到的知识,算不上原创 *参考文献见链接 目录 BL和BLF算法 BF算法 HR算法 PH算法
- JQuery中如何处理键盘事件
背景:比如在页面中,敲击回车键以后,实现登录功能,在之前的Winform开发时,也遇到过处理键盘事件的功能,比如游戏软件中,上下左右的移动等. 代码如下: $(document).keydown(fu ...
- vue 的 scroller 使用
一 安装 使用npm 安装npm install vue-scroller -d 二 引入 import VueScroller from "vue-scroller" Vue.u ...
- Window Phone 8手电筒
一直想开发一个Wp8的手电筒程序,看了好多别人开发的基本上有以下问题: 1.锁屏闪光灯关闭了 2.闪光灯不停的闪烁. 我就想开发一个锁屏也能用的手电筒,发现找资料那是相当的困难.找到的代码基本都不能令 ...
- 六丶人生苦短,我用python【第六篇】
Python基础之函数 三元运算 三元运算(三目运算),是对简单的条件语句的缩写. # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给resu ...
- js中取绝对值的2种方法!
1.abs() var aaa=-20; var bbb=Math.abs(aaa); 2.加减法 var aaa=-20; var bbb=-aaa
- HDU 4280 Island Transport
Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...
- BZOJ 3143 [Hnoi2013]游走 ——概率DP
概率DP+高斯消元 与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0. 一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的 ...