C++入门到理解阶段二基础篇(9)——C++结构体
1.概述
前面我们已经了解到c++内置了常用的数据类型,比如int、long、double等,但是如果我们要定义一个学生这样的数据类型,c++是没有的,此时就要用到结构体,换言之通过结构体可以帮我们定义自己的数据类型。
2.结构定义和使用
格式 struct 结构体名{//成员列表};
比如定义一个学生类型结构体
struct Student
{
string name;
int age;
};
上面定义好了学生这种数据类型,那如何创建一个Student类型的数据呢?有以下三种方式,推荐一二种
第一种
#include <iostream>
#include <string>
using namespace std;
struct Student
{
string name;
int age;
};
int main() {
//第一种,创建并赋值
Student s1;
s1.name = "张三";
s1.age = 12;
cout << s1.age << s1.name;
}
第二种
#include <iostream>
#include <string>
using namespace std;
struct Student
{
string name;
int age;
};
int main() {
//第二种
struct Student s1 = {"李四",12};
cout << s1.age << s1.name;
}
第三种
#include <iostream>
#include <string>
using namespace std;
struct Student
{
string name;
int age;
}s1;
int main() {
s1.age = 12;
s1.name = "lisi";
cout << s1.age << s1.name;
}
3.结构体数组
#include <iostream>
#include <string>
using namespace std;
//1.定义一个student结构体
struct student
{
string name;
int age;
};
int main() {
//2.定义结构体数组
struct student arr[3] =
{
{"aaa",12},
{"bbb",12},
{"ccc",12}
};
//3.结构体变量赋值
arr[2].age = 20;
arr[2].name = "ddd";
//4.访问结构体数组
for (int i = 0; i < 3; i++) {
cout << arr[i].age << arr[i].name <<endl;
}
}
4.结构体指针
#include <iostream>
#include <string>
using namespace std;
//1.定义一个student结构体
struct student
{
string name;
int age;
};
int main() {
struct student s = { "lisi",12 };
//2.定义一个结构体指针
struct student* p = &s;
//4.使用结构体指针访问结构体中的属性,需要使用->
cout << p->age << p->name;
}
5.嵌套结构体
#include <iostream>
#include <string>
using namespace std;
//1.定义一个student结构体
struct student
{
string name;
int id;
};
//2.定义一个嵌套结构体
struct school {
string name;
int id;
struct student s;
};
int main() {
//3.创建school变量
school sc = {};
sc.id = 1;
sc.name = "清华";
sc.s.id = 2;
sc.s.name = "lisi";
cout << sc.id << sc.name << sc.s.id << sc.s.name << endl;
}
6.结构体作为函数参数传递
第一种作为值传递(不会修改实参)
#include <iostream>
#include <string>
using namespace std;
//1.定义一个student结构体
struct student
{
string name;
int id;
};
void p(struct student s);
int main() {
struct student s = { "lisi",10 };
p(s);
cout << "id:" << s.id <<"姓名:"<< s.name<<endl;//id:10姓名:lisi
return 0;
}
//2.定义一个函数
void p(struct student s) {
s.id = 100;
cout << "id:" << s.id <<"姓名:" << s.name << endl;//id:100姓名:lisi
}
第二种作为地址传递(会修改实参)
#include <iostream>
#include <string>
using namespace std;
struct student
{
string name;
int id;
};
void p(struct student *s);
int main() {
struct student s = { "lisi",10 };
p(&s);
cout << "id:" << s.id <<"姓名:"<< s.name<<endl;//id:100姓名:lisi
return 0;
}
void p(struct student *s) {
s->id = 100;
cout << "id:" << s->id <<"姓名:" << s->name << endl;//id:100姓名:lisi
}
注意:
//使用地址传递可以避免大量变量赋值占用空间的问题,提高效率,但是会修改实参,如何解决?
void p(const struct student* s) {//使用const修饰之后,对于地址传递,只会读不会修改数据
//s->id = 100;将不能修改
cout << "id:" << s->id << "姓名:" << s->name << endl;//id:100姓名:lisi
}
C++入门到理解阶段二基础篇(9)——C++结构体的更多相关文章
- C++入门到理解阶段二基础篇(8)——C++指针
1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...
- C++入门到理解阶段二基础篇(6)——C++数组
概述 C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 numbe ...
- C++入门到理解阶段二基础篇(5)——C++流程结构
1.顺序结构 程序从上到下执行 2.选择结构(判断结构) 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). C++ 编程 ...
- C++入门到理解阶段二基础篇(3)——C++数据类型
目录 1.数据类型概述 2.基本的内置类型 整型 实型(浮点型) 字符型 转义字符 字符串型 c风格的字符串 c++风格的字符串 布尔类型bool 1.数据类型概述 使用编程语言进行编程时,需要用到各 ...
- C++入门到理解阶段二基础篇(7)——C++函数
目录 函数作用 函数定义 函数声明 函数调用 函数值传递 函数常见的样式 函数的分文件书写 函数作用 将经常使用的代码封装起来,减少重复代码 函数定义 C++ 中的函数定义的一般形式如下: retur ...
- C++入门到理解阶段二基础篇(4)——C++运算符
目录 算术运算符(进行四则运算) 赋值运算符(表达式的值赋给变量) 比较运算符(表达是比较,返回一个真值或假值) 逻辑运算符(返回表格式的结果真或假) 位运算符 杂项运算符 C++ 中的运算符优先级 ...
- C++入门到理解阶段二基础篇(2)——C++注释、变量、常量、关键字、标识符
目录 1.注释 注释作用 注释的方式 2.变量 变量基本知识 定义变量 3.常量 常量基本知识 整数常量 浮点常量 布尔常量 字符常量 字符串常量 常量定义 使用 #define 预处理器. 使用 c ...
- C++入门到理解阶段二基础篇(1)——简介与环境安装
1.C++ 简介 C++ 是一种静态类型的.编译式的.通用的.大小写敏感的.不规则的编程语言,支持过程化编程.面向对象编程和泛型编程. C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点. ...
- C++入门到理解阶段二核心篇(1)——c++面向对象概述、内存分析、引用
1.c++内存分区模型 c++程序在运行的过程中,内存会被划分为以下四个分区 代码区:程序的所有程序的二进制代码,包括注释会被放到此区 全局区:存放静态变量.全局变量.常量(字符串常量和const修饰 ...
随机推荐
- 从零开始—Socket系统调用和多态封装
1 重新搭建实验环境 前面都是用实验楼环境做的实验,偷的懒总是要还的,这一次重装环境前后花了十几个小时,踩了无数的坑. 1.1 Ubuntu和LINUX内核的区别 Ubuntu是基于LINUX内核编写 ...
- android 7.0+、8.0+应用中点击拍照崩溃的解决办法
在开发中,项目里面明明已经添加过拍照或者读取相册的权限,但是在点击拍照或者打开相册的时候应用会崩溃,报一下错误: Caused by: android.os.FileUriExposedExcepti ...
- python的memory_profiler模块使用
本文主要介绍了python内存分析工具: memory_profiler,可以展示每一行代码执行所增加的内存,方便做内存调优和排除bug memory_profiler是第三方模块,需要安装才能使用 ...
- C#程序编写高质量代码改善的157个建议【16-19】[动态数组、循环遍历、对象集合初始化]
前言 软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开 ...
- 分布式事物 - 基于RPC调用 - TCC模式
前提 前端业务(主服务)可以以同步或异步调用TCC框架,或者TCC框架本身就是同步异步兼备的. 假定TCC框架拥有断电后的自动恢复能力.同时,在下游业务出现无限失败的情况下,也会进行无限的重试,以达到 ...
- System.InvalidOperationException: The binary operator NotEqual is not defined for the types 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer' and 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer'.
.netcore 2.1使用左表连接时报错,原因是对数据库中实体 DateTimeOffset date做查询判断时,将数据库中date转为string进行了判断,这样判断是错误的,并且效率低,应该是 ...
- CODING 代码多仓库实践
关于代码的管理问题已经讨论多年,随着企业业务的复杂度提高.软件行业技术栈的选择度变宽泛,现代软件的代码仓库也变得越来越庞大和复杂.一个中型项目,将测试代码.核心业务代码.编译构建.部署打包等基础设施的 ...
- Linux 使用vi命令的教程
一.首先用vi命令打卡要编辑的文件: 注意:vi命令的使用如下: 打开或新建文件,并将光标至于第一行首:[root@centos6 /]# vi /etc/my.cnf 打开文件,并将光标移至最后一行 ...
- js 对象 / json / jsonb / jsonp 区别
一.JSON vs JS 对象 1.区别 区别 Javascript 对象 Json 含义 对象的实例 一种数据格式(序列化格式) 传输 不能传输 可以跨平台传输,轻量级 格式 1.键不加引号.加单引 ...
- MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束
最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...