当前位置: 首页 > news >正文

结构体与引用

1.结构体基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

2.结构体定义和使用

语法: struct 结构体 { 结构体成员列表 };

通过结构体创建变量的方式有三种:

struct 结构体名 变量名

struct 结构体名 变量名= { 成员1值,成员2值...}

定义结构体时顺便创建变量

struct Student {

//姓名

string name;

int age;

string address;

}stul;

stul.name = "11111";

cout << stul.name<< endl;

struct Student stu2;

stu2.name = "222222";

cout << stu2.name << endl;

3.结构体数组

作用: 将自定义的结构体放入到数组中方便维护

语法: struct 结构体名 数组名[ 元素个数 ] = { {} , {} , {} ,{} }

//创建结构体数组

struct Student stuArray[3] =

{

{"login",45,"ggg"},

{"res",35,"yyy"},

{"ooo",45,"ppp"},

};

//遍历结构体数组

for (int i = 0;i < 3;i++)

{

cout << "姓名:" << stuArray[i].name << " 年龄:" << stuArray[i].age << endl;

}

4.结构体指针

作用: 通过指针访问结构体中的成员

利用操作符 -> 可以通过 结构体指针 访问 结构体属性

//1.创建学生结构体变量

struct Student s = {"df",3," fd"};

//2.通过指针指向结构体变量

Student *p = &s;

//3.通过指针访问结构体变量中的数据

cout << "姓名: " << p->name << endl;

5.结构体中const使用场景

作用: 用const来防止误操作

//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来

void printStudents(const Student *s) {

//s->name = "gg";//加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作

cout << "姓名: " << s->name << endl;

}

6.内存分区模型

C++程序在执行时,将内存大方向划分为4个区域

·代码区: 存放函数体的二进制代码,由操作系统进行管理的

·全局区: 存放全局变量和静态变量以及常量

·栈区:由编译器自动分配释放,存放函数的参数值,局部变量等

·堆区: 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区意义:

不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

代码区:

存放CPU执行的机器指令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

全局变量和静态变量存放在此.

全局区还包含了常量区,字符串常量和其他常量也存放在此.

该区域的数据在程序结束后由操作系统释放

栈区:

由编译器自动分配释放,存放函爱的参数值,局部变量等

注意事项: 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放.'局部变量存放在栈区,栈区的数据在函数执行完后自动释放.

堆区:

融程序员分配释放,若程序员不释放,程序结束时由操作系统回收

在C++中主要利用new在堆区开辟内存

7.New操作符

C++中利用new操作符在堆区开辟数据

堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete

语法: new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

//创建10整型数据的数组,在堆区

int *arr = new int[10];

for (int i = 0;i < 10;i++) {

arr[i] = i + 22;//赋值

cout << arr[i] << endl;

}

//释放堆区的数组

//释放数组的时候要加[]才可以

delete[] arr;

8.引用

对变量起别名

本质: 引用的本质在c++内部实现是一个指针常量.

引用基本语法 : 数据类型 &别名 = 原名

int a = 10;

int &b = a;

引用注意事项

·引用必须初始化

·引用在初始化后,不可以改变

int &b;//错误

int c=5;

int a=6;

int &b=a;

b=c; //赋值操作,而不是更改引用

引用做函数参数

作用: 函数传参时,可以利用引用的技术让形参修饰实参

优点: 可以简化指针修改实参

//引用传递

void Swap03(int &a, int &b) {

int temp = a;

a = b;

b = temp;

}

//指针传递

void swap(int *a, int*b) {

int temp = *a;

*a = *b;

*b = temp;

}

引用做函数返回值

作用: 引用是可以作为函数的返回值存在的

注意: 不要返回局部变量引用

int& tt1() {

int a = 7;//局部变量 存放在四区中的 栈区

return a;

}

int &he = tt1();

cout << "he= " << he << endl;//第一次结果正确,是因为编译器做了保留

cout << "he= " << he << endl;//第二次结果错误,因为a的内存已经释放

用法: 函数调用作为左值

int& tt2() {

static int a = 7; // 静态变量,存放在全局区,全局区上的数据在程序结束后系统释放

return a;

}

int &he2 = tt2();

cout << "he2= " << he2 << endl;

cout << "he2= " << he2 << endl;

tt2() = 999;;//如果函数的返回值是引用,这个函数调用可以作为左值

cout << "he2= " << he2 << endl;

cout << "he2= " << he2 << endl;

常量引用

作用: 常量引用主要用来修饰形参,防止误操作

在函数形参列表中,可以加const修饰形参,防止形参改变实参

//打印

void showValue(const int &val) {

//val = 999;//错误

cout << "val=" << val << endl;

}

//加上const之后编译器将代码修改 int temp = 10; const int & ref = temp;

const int & ref=10;//引用必须引一块合法的内存空间

// ref = 11; // 加入const之后变为只读,不可以修改 |

int a = 12;

showValue(a);

http://www.lryc.cn/news/12832.html

相关文章:

  • 13.罗马数字转整数
  • JVM垃圾回收机制
  • Java File类、IO流、Properties属性类
  • MySQL备份恢复(十二)
  • 【Java|golang】1792. 最大平均通过率---封装最小堆
  • PHP 页面静态化
  • 【Python】进制、计算机中的单位、编码、数据类型、索引、字符串切片、字符串的功能方法
  • 基于android的无人健身房
  • 带你Java基础入门
  • VNCTF 2023 - Web 象棋王子|电子木鱼|BabyGo Writeups
  • 「JVM 编译优化」插入式注解处理器(自定义代码编译检查)
  • 一文彻底理解大小端和位域 BIGENDIAN LITTLEENDIAN
  • 面试准备知识点与总结——(虚拟机篇)
  • spring cloud 集成 seata 分布式事务
  • k8s篇之概念介绍
  • JavaScript学习第1天:浏览器组成、JS的组成、变量、数据类型转化、运算符、while和do...while循环
  • 【Flutter入门到进阶】Dart进阶篇---Dart多线程异步原理
  • WEB系列(二)-----------XSS
  • [python入门㊾] - python异常中的断言
  • 一文告诉你什么是财务数据治理?
  • MySQL数据库调优————ORDER BY语句
  • Linux命令之grep
  • 一起学 pixijs(4):如何绘制文字md
  • mac m1设备上安装Qt并使用qt编程遇到的问题以及解决方式
  • tensorflow 学习笔记(二):神经网络的优化过程
  • 【Java】《Java8 实战》 CompletableFuture 学习
  • Vue3之条件渲染
  • 将Nginx 核心知识点扒了个底朝天(四)
  • 设计模式之工厂模式
  • 80.链表-由来