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++结构体的更多相关文章

  1. C++入门到理解阶段二基础篇(8)——C++指针

    1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...

  2. C++入门到理解阶段二基础篇(6)——C++数组

    概述 C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 numbe ...

  3. C++入门到理解阶段二基础篇(5)——C++流程结构

    1.顺序结构 程序从上到下执行 2.选择结构(判断结构) 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). ​ C++ 编程 ...

  4. C++入门到理解阶段二基础篇(3)——C++数据类型

    目录 1.数据类型概述 2.基本的内置类型 整型 实型(浮点型) 字符型 转义字符 字符串型 c风格的字符串 c++风格的字符串 布尔类型bool 1.数据类型概述 使用编程语言进行编程时,需要用到各 ...

  5. C++入门到理解阶段二基础篇(7)——C++函数

    目录 函数作用 函数定义 函数声明 函数调用 函数值传递 函数常见的样式 函数的分文件书写 函数作用 将经常使用的代码封装起来,减少重复代码 函数定义 C++ 中的函数定义的一般形式如下: retur ...

  6. C++入门到理解阶段二基础篇(4)——C++运算符

    目录 算术运算符(进行四则运算) 赋值运算符(表达式的值赋给变量) 比较运算符(表达是比较,返回一个真值或假值) 逻辑运算符(返回表格式的结果真或假) 位运算符 杂项运算符 C++ 中的运算符优先级 ...

  7. C++入门到理解阶段二基础篇(2)——C++注释、变量、常量、关键字、标识符

    目录 1.注释 注释作用 注释的方式 2.变量 变量基本知识 定义变量 3.常量 常量基本知识 整数常量 浮点常量 布尔常量 字符常量 字符串常量 常量定义 使用 #define 预处理器. 使用 c ...

  8. C++入门到理解阶段二基础篇(1)——简介与环境安装

    1.C++ 简介 C++ 是一种静态类型的.编译式的.通用的.大小写敏感的.不规则的编程语言,支持过程化编程.面向对象编程和泛型编程. C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点. ...

  9. C++入门到理解阶段二核心篇(1)——c++面向对象概述、内存分析、引用

    1.c++内存分区模型 c++程序在运行的过程中,内存会被划分为以下四个分区 代码区:程序的所有程序的二进制代码,包括注释会被放到此区 全局区:存放静态变量.全局变量.常量(字符串常量和const修饰 ...

随机推荐

  1. koa安装教程

    此安装是在windows下进行 1.全局安装 npm install -g koa-generator 安装成功后会出现以下信息 创建项目 koa2 -e koa2-learn 2.1 -e指的是使用 ...

  2. Linux搭建rsync服务

    一.Rsync的简单介绍 Rsync是一款开源的.快速的.多功能的.可实现全量及增量(全量备份是指全部备份,增量备份是在上一次备份的基础上只备份更新的内容)的本地货远程数据同步备份的优秀工具.Rsyn ...

  3. java基础篇一

    引言 本人系南京一小小学校的大三小小菜鸟,三年来学了很多杂七杂八的,也荒废了大量的时间,马上就要秋招了,之前也看了不少面试题,备选了一些简单的项目,看了不知多少本的几百页厚的各种知识的pdf电子书,发 ...

  4. maven 利用 profile 进行多环境配置

    我们在进行项目的多环境配置时,有很多种方式供我们选择,比如 SpringBoot 自带的 application-dev.yml.maven 的 profile 等.这里介绍的就是如何利用 profi ...

  5. js获取当前时间的年月日时分秒以及时间的格式化

    1.获取当前时间 var myDate = new Date(); 2.获取时间中的年月日时分秒 myDate.getYear(); // 获取当前年份(2位) myDate.getFullYear( ...

  6. Java面试题_第二阶段(Servlet、HTTP、Session、JSP、 Ajax、Filter、JDBC、Mysql、Spring)

    1.1. 描述Servlet调用过程? 答案: (1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址. (2)浏览器根据 ...

  7. Oracle trunc函数的使用

    1. 对日期的操作 2. 对数字的操作 1.对日期的操作 /**************日期********************/ SELECT TRUNC(SYSDATE) FROM DUAL; ...

  8. webpack-dev-server工具

    webpack-dev-server来实现自动打包编译功能 // 1.npm install webpack-dev-server -D//2.和webpakc命令用法一样// 3.是本地安装的,无法 ...

  9. Leetcode刷题笔记(Python 找出所有相加之和为n的k个组合,组合中只允许含有1-9的正整数,并且每种组合中不存在重复的数字。)

    eg:输入:k=3,n=9 输出: [[1,2,6],[1,3,5],[2,3,4]] 输入:k=2,n=5 输出:[[1,4][2,3]] #!/usr/bin/env python # -*- c ...

  10. swoole如何使php永久运行

    有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群​jq.qq.com soole可以通过开启守护进程使PHP永久运行. 守护进程化.设 ...