C++学习笔记(六)--结构体
1.一种自定义的类型--结构体
定义:
struct 结构体名称 {
//成员表列也称作域 还可以包括函数,即函数成员,不过一般结构体类型中不包含,而是放在类中。
类型名 成员名;
};
这种结构体类型类似于数据库中的记录
例:
struct Me{
char name[20];
char IDnumber[20];
int age;
};
此时只是声明了一个Me类型,并未在内存中分配存储单元,只有定义了结构体类型的变量后,才会分配内存,类似int,float这些类型一样。
2.声明结构体变量的方法:
a.已经定义好Me类型,则:Me me1,me2;
b.在定义变量时就定义结构体变量:
struct Me{
char name[20];
char IDnumber[20];
int age;
}me1,me2;
c.没有定义结构体类型名,这种方法不建议使用:
struct {
char name[20];
char IDnumber[20];
int age;
}me1,me2;
3.给结构体变量初始化
与所有变量一样,两种方法:
a.定义时初始化:
struct Me{
char name[20];
int age;
}My_baby{ "Xiao_min", 22 };
b.声明结构体类型与定义变量分开,定义变量时初始化:
Me My_baby = { "Xiao_min", 22 };
注意:只能给结构体变量初始化,不能给结构体类型初始化,编译时只给结构体变量分配内存,不给结构体类型分配存储空间。
4.结构体变量引用
a.可以将同类型的结构体变量整体赋值:me1 = me2;
b.引用成员变量 me1.name[20] = "Xiao_min";//. 为成员运算符,其优先级在所有运算符中最高
c.如果成员变量中也有结构体类型的变量就要逐级引用:
me1.student.age;//引用结构体变量me1中的student成员中的age。
d.要输出结构体变量的内容,只能一个一个引用输出,不能像字符数组那样直接输出。
e.可以引用结构体变量的地址:cout <<&me1;
也可引用成员变量的地址: cout <<&me1.age;
例:
#include<iostream>
using namespace std;
struct Date{
int month;
int day;
int year;
};
struct Student{
int num;
char name[20];
char sex;
Date birthday;
float score;
}student1,student2 = { 10002, "Xiao_min", 'f',12,23,1995,100 };//注意此处的初始化
int main(){
student1 = student2;
cout <<student1.num <<endl;
cout <<student1.name <<endl;
cout <<student1.sex <<endl;
cout <<student1.birthday.month <<"" <<student1.birthday.day <<"" <<student1.birthday.year <<endl;
cout <<student1.score <<endl;
return 0;
}
输出结果:
10002
Xiao_min
f
12231995
100
5.结构体数组
struct Me{
char name[20];
char IDnumber[20];
int age;
}me1[3] = { {"Xiao_min","110",22},{"Ding_ke","119",22},{"Luren_jia","120",22} };//即声明一个Me类型的结构体数组,数组中的每个元素都有三个域。
6.指向结构体变量的指针
一个结构体变量的指针就是该变量占据内存的起始地址。
例:
#include<iostream>
#include<cstring>
using namespace std;
int main(){
struct Student{
int num;
string name;
char sex;
float score;
};
Student stu;
Student *p;//声明一个Studeng类型的结构体指针
p = &stu;
stu.num = 1223;
stu.name = "Love Min";
stu.sex = 'f';
stu.score = 100;
cout <<(*p).num <<" " <<(*p).name <<" " <<(*p).sex <<" " <<(*p).score <<endl;//注意这里的()不能省,why?自己分析
cout <<p->num <<" " <<p->name <<" " <<p->sex <<" " <<p->score <<endl;//p-> 与 (*p). 等价,->称作指向运算符
return 0;
}
输出:
1223 Love Min f 100
小结:所以引用成员变量有三种方法:
a.结构体名称.成员名;
b.(*p).成员名;
c.p->成员名;//这种使用方法常在数据结构中遇到
注意:
a.p->n++;//得到p指向结构体的成员n,先使用,再使其++,从这里可以看出->与++的优先级。
b.++p->n;//得到p指向结构体的成员n,使其++,再使用;
7.用结构体变量 和 指向结构体变量的指针 构成链表
例:
struct Lover{
int age;
char name[20];
Lover *next; //指向下一个结点的指针
};
例:单向链表
#include<iostream>
#include<cstring>
using namespace std;
struct xiao_min{
string what_i_think_now;
struct xiao_min *xiao_min_next;
};
int main(){
xiao_min sentence_1,sentence_2,sentence_3;
xiao_min *head,*p;
sentence_1.what_i_think_now = "No matter what happens,I won't leave you";
sentence_2.what_i_think_now = "because i love you.";
sentence_3.what_i_think_now = "I miss you now!";
head = &sentence_1;
sentence_1.xiao_min_next = &sentence_2;
sentence_2.xiao_min_next = &sentence_3;
sentence_3.xiao_min_next = NULL;
p = head;
do{
cout <<p->what_i_think_now <<endl;
p = p->xiao_min_next;
}while( p!=NULL );
return 0;
}
输出结果:
No matter what happens,I won't leave you
because i love you.
I miss you now!
分析:
这种在程序中定义好的结点,不是临时开辟的,也不能用后释放,叫做 静态链表;
各个节点可以临时插入和删除的链表,这些临时插入和删除的结点没有名称,只能靠头指针查找,这样的链表称作 动态链表;建立
动态链表需要用到动态内存分配的运算符 new 和撤销动态内存分配的运算符 delete 。
8.结构体类型数据做函数参数
a.直接用结构体变量名做参数,和普通变量一样,值传递;
#include<cstring>
using namespace std;
struct Student{
int num;
string name;
};
int main(){
void print( Student );
Student stu;
stu.num = 110;
stu.name = "Ding";
/* stu.name[0] = 'D';
stu.name[1] = 'i';
stu.name[2] = 'n';
stu.name[3] = 'g';
*/
print( stu );
return 0;
}
void print( Student stu ){
cout <<stu.num <<endl <<stu.name <<endl;
}
b.用指向结构体变量的指针作参数,将结构体变量的地址传给形参;
#include<iostream>
#include<cstring>
using namespace std;
struct Student{
int num;
string name;
};
int main(){
void print( Student * );
Student stu,*p;
p = &stu;
stu.num = 110;
stu.name = "Ding";
print( p );
return 0;
}
void print( Student *stu ){
cout <<stu->num <<endl <<stu->name <<endl;
}
c.用结构体变量的引用变量作函数参数。
#include<iostream>
#include<cstring>
using namespace std;
struct Student{
int num;
string name;
};
int main(){
void print( Student & );
Student stu;
stu.num = 110;
stu.name = "Ding";
print( stu );
return 0;
}
void print( Student &st ){
cout <<st.num <<endl <<st.name <<endl;
}
9.动态分配和撤销内存的的运算符 new 和 delete
C++中用 new 和 delete 代替了C语言中的 malloc 和 free (但仍可使用,不建议),new、delete是运算符,所以效率更高。
new 使用:
new int;//在内存开辟一个存放整数的存储空间,返回一个指向该存储空间的地址;
new int(100);//在内存开辟一个存放整数的存储空间,初值为100,返回一个指向该存储空间的地址;
new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回一个指向该存储空间的地址;
new int[5][4];//开辟一个存放整型的二维数组的空间,返回一个指向该存储空间的地址;
float *p = new float(3.14159);//开辟一个存放单精度数的空间,并指定初值,将返回该空间的地址赋给指针变量p.
小结: new [初值];
new 返回的都是地址,且new一个数组空间时不能初始化。如果内存不足,无法开辟空间,返回空指针 NULL
delete 使用:
delete p;
delete []pt;//char *pt = new char[10]; []表示对数组空间操作
C++学习笔记(六)--结构体的更多相关文章
- C#学习笔记之结构体
1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有 ...
- contiki学习笔记---process结构体
process,字面意义,进程,看看它的结构 struct process { struct process *next; #if PROCESS_CONF_NO_PROCESS_NAMES #def ...
- 《PHP7底层设计与源码实现》学习笔记2——结构体对齐
书里给了一段代码,假如有个结构体如下: struct test { char a; int b; long c; void* d; int e; cha ...
- c语言学习笔记之结构体存储
今天讲讲结构体存储问题 首先,结构体简单说是对不同类型的封装,一开始我们可能会想结构体在内存中的存储的大小是直接元素的和 例如 我们可能会觉得是 结构体大小=int(4个字节)+ short(2个字节 ...
- C语言学习笔记--枚举&结构体
枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...
- 【C#学习笔记】结构体使用
using System; namespace ConsoleApplication { struct _st { public string name; public int age; } clas ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- Go学习笔记07-结构体与方法
Go学习笔记07-结构体与方法 Go语言 面向对象 结构的定义与创建 面向对象 Go语言只支持封装,不支持继承和多态. Go语言中只有struct,即结构体:没有class. 结构的定义与创建 pac ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- Codeforces Round #427 (Div. 2) - B
题目链接:http://codeforces.com/contest/835/problem/B 题意:给定一个数k和一个数字串n.问你最少改几个数字才能满足所有数字的和不小于k. 思路:考虑贪心,每 ...
- 写了一个简单的 Mybatis
写了一个简单的 Mybatis,取名 SimpleMybatis . 具备增删改查的基本功能,后续还要添加剩下的基本数据类型和Java集合类型的处理. 脑图中有完整的源码和测试的地址 http://n ...
- windows 10 x64系统 jdk1.7、jdk1.8 切换(jdk为exe安装版本)
电脑先安装的1.7,后来安装1.8,改JAVA_HOME为1.8后cmd->java.javac.java -version可用1.8 后想改为1.7,更改环境变量(步骤1)后cmd->j ...
- 【洛谷P2398】GCD SUM
题目大意:求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 题解: 最重要的一步变换在于. \[\sum\limits_{k=1}^n k \s ...
- RAC heartbeat 心跳机制
世界上最遥远的距离,不是生与死.而是我们同一个集群的两个节点,你却听不到我的心跳. 必要性:维持集群的⼀致性RAC⼼跳机制 – 集群⼼跳基本机制:1.确定节点和节点间的连通性,达到彼此了解2.⽤共享的 ...
- 如何提高SMTP邮件的安全性?从而不被黑客窃听
简单邮件传输协议(SMTP)用于在邮件服务器之间进行邮件传输,并且传统上是不安全的,因此容易被黑客窃听.命名实体的基于DNS的认证(国家统计局)用于SMTP提供了邮件传输更安全的方法,并逐渐变得越来越 ...
- vue请求数据
vue-resource: 推荐教程:https://www.runoob.com/vue2/vuejs-ajax.html 1. 需要安装vue-resource模块, 注意加上 --save np ...
- 【leetcode】1175. Prime Arrangements
题目如下: Return the number of permutations of 1 to n so that prime numbers are at prime indices (1-inde ...
- CDMA与OFDM之技术比较
频谱利用率.支持高速率多媒体服务.系统容量.抗多径信道干扰等因素是目前大多数固定宽带无线接入设备商在选择CDMA(码分多址)或OFDM(正交 频分复用)作为点到多点(PMP)的关键技术时的主要出发点. ...
- 线程协作之threading.Condition
领会下面这个示例吧,其实跟java中wait/nofity是一样一样的道理 import threading # 条件变量,用于复杂的线程间同步锁 """ 需求: 男:小 ...