cpp学习记录03

news2024/11/24 20:20:28

结构体

定义:用户自定义符合数据类型,可以包含不同类型的不同成员。

//声明结构体
struct 结构体类型(自己起名)
{
    成员1类型 成员1名称;
    。。。
    成员N类型 成员N名称;

}

基本用法(类似class)

    struct  Student {
        string name;
        int age = 20; //设定默认值
        string gender;
    };

    //结构体的变量声明 可以在前面带上struct关键字(非必须 但推荐写)
    struct Student stu;

    //对结构体变量赋值
    stu = {"sj",11,"male"};
    //cout<< stu << endl;  结构体变量是一个整体的包装,无法直接cout输出
    cout << stu.name <<endl;

结构体数组

    
    struct  Student {
        string name;
        int age;
        string gender;
    };
    //方式1声明
    struct Student stu2[3];
    stu2[0] = {"kk",11,"male"};
    stu2[1] = {"dd",3,"female"};
    stu2[2] = {"ll",4,"male"};

    //方式2声明
    struct Student stu3[3] = {{"kk",11,"male"},{"dd",3,"female"},{"ll",4,"male"}};
    for(Student i:stu2) {
        cout << i.name << endl;
    }

结构体指针

    struct Student stu0 = {"cc",12,"male"};
    //创捷结构体指针,指向结构体对象的地址
    struct Student * p = &stu0;
    //通过结构体指针访问成员
    cout << p-> name <<endl;
//自己管理内存空间    
struct Student * p7 = new Student {"qq",39,"male"};
    delete p7;

结构体指针数组

    //方式1
    struct Student stu4[3] = {{"kk",11,"male"},{"dd",3,"female"},{"ll",4,"male"}};
    struct Student * p1 = stu4;
    cout << p1[0].name <<endl;
    //方式2 能自己管理内存
    struct Student * p9 = new Student[3]{{"kk",11,"male"},{"dd",3,"female"},{"ll",4,"male"}};
    cout << p9[0].name <<endl;
    delete[] p9;

函数

//语法
返回值类型 函数名称 (参数列表)
{
函数体
。。。
返回值
}

地址传递

void switch_num(int *a,int *b) {
    //直接对地址里的内容进行修改,能实现对外部变量进行操作
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main(int argc, char *argv[]) {
    int *a = new int(10);
    int *b = new int(20);
    switch_num(a,b);
    cout << *a << endl;  //20
    cout << *b << endl;  //10
    delete a;
    delete b;
}

函数传入数组

由于数组对象本身只是第一个元素的地址,所以数组传参不区分值传递还是地址传递。本质都是传地址

void arr_test(int a[],int length)  //很难通过地址值知道数组长度,所以一般要求把数组长度
                                    //作为参数传入
{
   cout<<sizeof(a)<<endl;  //指针长度 8字节
   //说明传进来的就是指针
    for(int i=0 ; i<length ; i++) {
        cout<<*(a+i)<<endl;
        cout<<a[i]<<endl;
    }
}

int main(int argc, char *argv[]) {
   int arr[] = {1,2,3,4,5,6,7};
   cout<<sizeof(arr)<<endl;  //28 7*4字节
   arr_test(arr,sizeof(arr)/sizeof(arr[0]));  
}

排序练习

void sort(int arr[],int length) {
    for(int i=0;i<length;i++) {
        int temp;
        int min = arr[i];
        int min_index = i;
        for(int j=i;j<length;j++) {
            if(arr[j]<min) {
                min = arr[j];
                min_index = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[min_index];
        arr[min_index] = temp;
    }
}
int main(int argc, char *argv[]) {
   int arr[] = {2,10,4,3,9,6,7};
    sort(arr,sizeof(arr)/sizeof(arr[0]));
    for(int i:arr) {
        cout<<i<<endl;
    }
}

引用

引用:是变量的一个别名,它是某个已存在变量的另一个名字

特点:1引用创建后不可更改(更改指向到其他内存区域)

2.因为不可更改,所以引用必须初始化

3.因必须初始化,所以引用不可为空(不可修改)

本质:是一个指针常量

    int a = 10;
    //数据类型& 引用名 = 被引用变量;
    int& b = a;     //自动转换为 int* const b = &a  指向地址不可改
    cout << "a=" << a <<endl; //10
    cout << "b=" << b <<endl; //10
    a = 20;
    cout << "a=" << a <<endl; //20
    cout << "b=" << b <<endl; //20
    b = 30;         //内部发现b是引用,自动转换为 *b = 30
    cout << "a=" << a <<endl; //30
    cout << "b=" << b <<endl; //30
    //相当于a和b完全等价了

引用传递

void switch_num(int &x,int &y)  //这里相当于执行了 int* const x=&a;
                                                //int* const y =&b;
{
 int temp = x;
    x = y;
    y = temp;
}
int main(int argc, char *argv[]) {
    int a = 10;
    int b = 20;
    switch_num(a,b);
    cout<<a<<endl;  //20
    cout<<b<<endl;  //10
    return 0;
}

常量引用

目的:防止误操作修改引用值

//误操作情况
void show(int& x) {
    x = 100;    //误操作
    cout<< x <<endl;
}
int main(int argc, char *argv[]) {
    int a = 10;
    show(a);
    cout<<a<<endl;  //导致变量a的值变为100
    return 0;
}
//用const修饰后
void show(const int& x) {
    x = 100;    //用const修饰后 编译阶段直接报错不通过防止犯错
    cout<< x <<endl;
}

返回指针的函数

语法

返回值类型 * 函数名(形参){
    函数体
    return 指针
}

实例

//错误写法
int * add(int a,int b) {
    int sum;
    sum = a + b;
    return &sum; //这是局部变量,在函数执行完毕后,变量会被销毁,所占内存空间将被释放
    //这就是C++的静态内存管理,如果要规避需要动态内存管理(new delete)
}
//正确写法
int * add1(int a,int b) {
    int *sum = new int;
    *sum = a + b;
    return sum;
}
int main() {
    int* c = add1(1,2);

    delete c;  //不删除的话会有提示
}

函数返回数组

其实和返回指针是一样的,因为返回数组本质上就是返回指针

函数重载

函数名可相同

需要满足的条件:同一个作用于下,名称相同,函数参数类型不同,或个数不同,或顺序不同

static

是一个关键字可以修饰 函数和变量

int * add(int a,int b) {
    static int sum = a + b;  //当用static修饰后,函数完成时不会被回收
    return &sum;
}

int main() {
    int *p = add(1,2);
    cout << *p << endl;
    return 0;
}

但无限制的使用static会浪费内存

内存分区模型

内存大方向分为4个区域

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索 Electron:构建用户友好的登录页面流程

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

88年汉城奥运追忆:差距尤存,出路何在

&#xff08;35年前的文章&#xff0c;摘自1989年2月1日《大众日报》&#xff09; 差距尤存 出路何在 ——汉城奥运会后的思索 刘伟 一项调查表明&#xff1a;在当今中国中学生最喜爱的十本杂志中&#xff0c;竟没有一本是体育类杂志&#xff1b;在城市工人、干部、科技人员家…

搜索引擎项目(四)

SearchEngine 王宇璇/submit - 码云 - 开源中国 (gitee.com) 基于Servlet完成前后端交互 WebServlet("/searcher") public class DocSearcherServlet extends HttpServlet {private static DocSearcher docSearcher new DocSearcher();private ObjectMapper obje…

【前端/js】使用js读取本地文件(xml、二进制)内容

目录 说在前面FileReaderDOMParser文本文件二进制文件 说在前面 浏览器版本&#xff1a;Microsoft Edge 126.0.2 (正式版本) (64 位) FileReader MDNFileReader 接口允许 Web 应用程序异步读取存储在用户计算机上的文件&#xff08;或原始数据缓冲区&#xff09;的内容&#x…

Golang 高性能 Websocket 库 gws 使用与设计(一)

前言 大家好这里是&#xff0c;白泽&#xff0c;这期分析一下 golang 开源高性能 websocket 库 gws。 视频讲解请关注&#x1f4fa;B站&#xff1a;白泽talk 介绍 gws&#xff1a;https://github.com/lxzan/gws &#xff5c;GitHub &#x1f31f; 1.2k&#xff0c;高性能的 …

STM32(七):STM32指南者-通信实验

目录 一、基本概念通讯基本概念1、串行和并行2、同步通讯与异步通讯3、全双工、半双工、单工4、通讯速率 USART基本概念1、串口通讯基本概念2、物理层3、协议层4、指南者的串口USART I2C基本概念SPI基本概念 二、USART串口实验前期准备1、安装安装 USB 转串口驱动_CH3402、野火…

【中项】系统集成项目管理工程师-第5章 软件工程-5.1软件工程定义与5.2软件需求

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

代码随想录算法训练营day22 | 77. 组合、216.组合总和III 、17.电话号码的字母组合

碎碎念&#xff1a;加油 参考&#xff1a;代码随想录 回溯算法理论基础 回溯和递归是相辅相成的&#xff0c;只要有递归&#xff0c;就会有回溯。回溯通常在递归函数的下面。 回溯搜索到法的效率&#xff1a; 它其实是纯暴力的做法&#xff0c;不是一个高效的算法。 回溯法能…

将控制台内容输出到文本文件

示例代码&#xff1a; Imports System.IO Module Module1Sub Main()Dim fs As New FileStream("D:\Desktop\test\输出结果.txt", FileMode.Create, FileAccess.Write, FileShare.None)Dim sw As New StreamWriter(fs)Console.SetOut(sw)Console.SetError(sw)For i …

Spring 自定义集合实现策略

Spring 自定义集合实现策略 日常开发中&#xff0c;如果遇到复杂业务通常会用一个接口实现多个实现类。需要根据对应参数判断获取不同实现类。例如支付场景&#xff0c;根据选择支付方式&#xff0c;选择相应路由。如果实现类不多&#xff0c;通常会这样。如果实现类多了&…

【论文10】复现代码tips

一、准备工作 1.创建一个虚拟环境 conda create --name drgcnn38 python=3.8.18 2.激活虚拟环境 conda activate drgcnn38 注意事项 在Pycharm中终端(terminal)显示PS而不是虚拟环境base 问题如下所示 解决方法:shell路径改成cmd.exe 重启终端显示虚拟环境 3.安装torch …

Linux:Linux进程控制

目录 1. 进程概念 1.1 并行和并发 2. 进程创建 2.1 fork()函数初识 2.2 写时拷贝 2.3 fork常规用法 2.4 fork调用失败的原因 3. 进程终止 3.1 进程场景 3.2 进程常见退出方法 4. 进程等待 4.1 进程等待必要性 4.2 进程等待的方法 4.2.1 wait方法&#xff1a; 4.…

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起&#xff0c;我们不再单独介绍推荐算法的原理&#xff0c;而是开始进入一个新的模块-工程篇。 在工程实践的部分中&#xff0c;我首先介绍的内容是当今最热门的信息流架构。 信息…

关于数据存储位置的一点知识

关于数据存储位置的一点知识

c++红黑树,插入公式

概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因而是接近…

useRoute 函数的详细介绍与使用示例

title: useRoute 函数的详细介绍与使用示例 date: 2024/7/27 updated: 2024/7/27 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt.js中useRoute函数的详细用途与示例&#xff0c;展示了如何在组合式API中使用useRoute获取当前路由信息&#xff0c;包括动态参数、…

web服务器dns服务器配置服务

1.搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 server服务器&#xff1a; 创建 /share目录&#xff0c;并且编辑/etc/exports文件 更改目录权限为755&#xff1a; 755权限码的含义是&#xff1a; 文件所有者&#xff08;第一位数字7&…

Docker Desktop安装(通俗易懂)

1、官网 https://www.docker.com/products/docker-desktop/ 2、阿里云镜像 docker-toolbox-windows-docker-for-windows安装包下载_开源镜像站-阿里云 1. 双击安装文件勾选选项 意思就是&#xff1a; Use WSL 2 instead of Hyper-V (recommended) : 启用虚拟化&#xff0c;…

20240727生活沉思------------关于报考软考高级架构师

软考高级架构师 软考高级架构师 缴费 主要是报的千峰 1880元。 相对来说还算可以吧。。。其他也没给我机会选择啊 备考 我现在开始备考&#xff0c;考试时间2024年11月。 今天是正式开始7.27号。 给大家看看接下来我的课程安排&#xff1a; 额&#xff0c;还是满满当当的…

Redis从入门到超神-(十二)Redis监听Key的过期事件

前言 试想一个业务场景&#xff0c;订单超过30分钟未支付需要做自动关单处理,修改订单状态&#xff0c;库存回退等&#xff0c;你怎么实现&#xff1f;方案一&#xff1a;可以使用定时任务扫表&#xff0c;通过支付状态和下单时间来判断是否支付过期。但是这样的方案是非常消耗…