C++之函数指针与动态内存分配

server/2024/9/20 7:17:28/ 标签: c++, 算法

const int * p = &i;     //常指针
int * const p = &i;     //指针常量()

所有的单目运算符自右向左运算
*p++;

NULL    nullptr (c++11)空指针,修改了NULL与int之间的关系

返回值为指针的函数不能返回局部变量的地址
    局部变量的生存期结束,地址失效
    返回值为野指针

    char *Strcpy(char *dest, const char * src)
    {
        char *ret = dest;
        while (*src != '\0')
        {
            *dest++ = *src++;
        }
        *dest = '\0';
        return ret;
    }

    示例:函数的引用返回值
    int &fn(void)     //错误
    {
        int i = 0;
        return i;
    }

    int &fn(int &ref)
    {
        return ref;
    }
    int main()
    {
        int i = 0;
        fn(i) = 10;
        cout << i << endl;
        return 0;
    }    //i = 10;

函数指针:利用指针变量调用函数
    int fn(int a, int b)
    {
        return a + b;
    }
    int (*p)(int, int) = fn;

cpp11:函数指针类型别名
    匿名函数:lambda    [capture](argument){body}
    lambda 闭包:可以使用[]捕获外部变量
                [i] 捕获外部变量不能被修改
                [&i] 捕获外部变量可以被修改
                [=] 捕获外部全部变量
                [&] 引用捕获外部全部变量,可修改
            如果未捕获任何变量,则可作为函数指针
函数指针作用:解耦合(举例通过回调函数)

函数库中的qsort函数:解耦合
    int (*p)(const void *, const void *)
    qsort(arr, n, sizeof(int), p);

    int cmp(const void *a, const void *b)
    {
        return *(int *)a - *(int *)b;
    }
    

    int main()
    {
        int arr[] = {1, 3, 5, 2, 4};
       int n = sizeof(arr) / sizeof(arr[0]);
       qsort(arr, n, sizeof(int), cmp);
   }


=================================================
动态内存分配:
    c语言:Clock *p = malloc(sizeof(Clock));    //malloc返回的是void*
          free(p);
          使用malloc创建的对象,并不是真正意义上的创建对象,未调用构造和析构函数。
    cpp语言:以上编译出错
        Clock *p = reinterpret_cast<Clock *>(malloc(sizeof(Clock)));;
        free(p);

    创建:new
        Clock *p = new Clock;
        p->SetTime(1, 2, 3);
        delete p;

    malloc与new的区别:
        1、malloc返回的是void*,new返回的是对象指针
        2、malloc和free是函数,而new和delete是运算符
        3、malloc和free不调构造和析构函数
    
    创建数组:
        int *p = new int[10];
        delete[] p;

        int *p = new int;
        int *p = new int(10);
        delete p;

深复制和浅复制:
    浅复制:
        Clock *p = new Clock;
        Clock *q = p;       //q和p指向同一块内存
        delete p;           //p释放了内存,q指向的内存失效
        delete q;           //q释放了内存,程序出错

    深复制:
        Clock *p = new Clock;
        Clock *q = new Clock(*p);      //q和p指向不同的内存

    移动复制构造函数:
        


http://www.ppmy.cn/server/22424.html

相关文章

Git | Git基本命令

Git | Git基本操作 文章目录 Git | Git基本操作一、创建Git本地仓库1、创建Git仓库2、配置Git3、理解工作区、暂存区、版本库关系 二、添加、修改与查看添加文件查看历史提交记录 修改文件查看.git文件 三、版本回退版本回退撤销修改尚未add已add但还未commit已add并commit 删除…

如何基于Zookeeper实现注册中心模型?

在分布式系统中&#xff0c;通常会存在几十个甚至上百个服务&#xff0c;开发人员可能甚至都无法明确系统中到底有哪些服务正在运行。另一方面&#xff0c;我们很难同时确保所有服务都不出现问题&#xff0c;也很难保证当前的服务部署方式不做调整和优化。由于自动扩容、服务重…

C#基础之选择排序

选择排序 文章目录 选择排序1、概念2、代码实现 1、概念 1、新建一个下标 int index 0; 2、依次比较 3、找出极值 arr[index] < arr[n] 4、放入目标 //数组长度-1-n轮从第0轮开始 5、比较n轮2、代码实现 int[] arr new int[]{8,7,1,5,4,2,6,3,9}; 第一步 声明索引0&…

AI图书推荐:ChatGPT写论文的流程与策略

论文一直是任何学术学位的顶峰。它展示了学生在研究领域的兴趣和专业知识。撰写论文也是一个学习经验&#xff0c;为学术工作以及专业研究角色做好准备。但是&#xff0c;论文工作总是艰苦的&#xff0c;通常是充满乐趣和创造性的&#xff0c;但有时也是乏味和无聊的。生成式人…

django之select_related、prefetch_related

django中的ORM查询,针对复杂的查询,处理使用A.objects.filter(foreign_name__field)进行查询外。还可以使用select_related 和prefetch_related,进行性能的优化 select_related: 将会根据外键关系(注意: 仅限单对单和单对多关系),在执行查询语句的时候通过创建一条包含…

Web UI自动化测试--selenium其他使用方法

一、无头浏览器 应用场景: 无头的场景,一般先有头测试,再无头运行节省资源不关注正常的操作过程对错误的仍然可以截图示例: from selenium import webdrivermy_option =webdriver.ChromeOptions() my_option.add argument(-headless) driver= webdriverChrome(options=my…

Git 使用 下载分支 提交新项目到当前分支 三(公司快速上手版)

文章背景 git已经装好了&#xff0c;公司的也给创建好账户了&#xff0c;仓库地址也有了。 领导已经给你说了是哪个分支了。 如何下载远程仓库中的一个项目分支&#xff0c;到本地电脑上。 并且如何将新建的项目上传到当前分支的远程仓库 下载 步骤 创建文件夹。 右键 Op…

Django项目之图书管理系统

Django——图书管理系统 一、前期准备 1、创建好 Django 项目 2、准备好数据库 —— 创建数据库&#xff1a;book_system 3、配置项目中的数据库引擎 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: book_system,HOST: 127.0.0.1,USER: root,PASSWORD: ro…

mysql全量备份及数据恢复实践

前置 myql&#xff1a;8.0.34 percona-xtrabackup&#xff1a;percona-xtrabackup-8.0.34-29 一、全量备份脚本 #!/bin/bash #删除历史 find /data/backups -mtime 10 -exec rm -rf {} \; #下载备份工具 #wget https://file.zjwlyy.cn/percona-xtrabackup-8.0.34-22.tar…

Ubuntu下vscode彻底卸载

参考步骤&#xff1a;大佬博客 1、 执行以下命令卸载 Visual Studio Code&#xff1a; sudo apt purge code2、删除 Visual Studio Code 的配置文件和缓存文件。这些文件通常位于用户的主目录下的 .config 和 .cache 目录中。你可以使用以下命令删除它们&#xff1a; rm -rf …

Gateway

序言 本文给大家介绍一下 Spring Cloud Gateway 的基础概念以及使用方式。 一、快速入门 1.1 引入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

k8s如何写yaml文件

k8s&&如何写yaml文件 metadataspecresources: 如何设置request和limit&#xff1f; status metadata metadata: 通常用于填写一些对象&#xff08;如pod、deployment等&#xff09;的描述信息&#xff08;类似人的名字、年龄等&#xff09;。 spec spec: 通常代表着…

联软科技安全准入门户平台commondRetStr接口RCE漏洞复现[附POC]

文章目录 联软科技安全准入门户平台commondRetStr接口RCE漏洞复现[附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现联软科技安全准入门户平台commondRetStr接口RCE漏洞复现[附POC] 0x01 前言 免责声明:请勿利用文章内的…

http请求内容

Cookie 可以包含多个键值对&#xff0c;因此它不仅限于单个值。一个 Cookie 可以携带多个属性&#xff0c;每个属性由键值对表示 Set-Cookie: namevalue; expiresSat, 30 Apr 2022 23:59:59 GMT; path/; domain.example.com; secure; HttpOnly 在HTTP协议中&#xff0c;请求头之…

docker容器

一、docker容器操作 1.1 容器创建 将镜像加载到容器的过程。新创建的容器默认处于停止状态&#xff0c;不运行任何程序&#xff0c;需要在其中发起一个进程来启动容器。 格式&#xff1a;docker create [选项] 镜像 常用选项&#xff1a; -i容器开启标准输入-t让docker分配一个…

课时109:sed命令_基础实践_内容替换

2.1.2 内容替换 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 sed的文本替换动作是使用频率最高的一种样式。它的基本表现样式如下&#xff1a;命令格式&#xff1a;sed -i [替换格式] [文件名]源数据 | sed -i [替换格式]注…

IDE 高效快捷键

代码编辑器要擅用重构Refactor、全局搜索、全局替换、窥视Peek、代码自动格式化Format&#xff0c;才能真正为开发提效&#xff01; Intellij Idea 的常用快捷键(同 WebStorm) 按键功能Ctrl N根据输入的 类名 查找类文件Ctrl Shift N根据输入的 名称 查找任意文件Ctrl R在…

Linux基本指令(2)

目录 mv指令&#xff1a; cat&#xff1a; more指令&#xff1a; less指令&#xff1a; head指令&#xff1a; tail指令&#xff1a; mv指令&#xff1a; 说明&#xff1a; mv命令是move的缩写&#xff0c;可以用来移动文件或者文件改名(move(rename)files),是linux系统下…

QT支持多种开发语言

QT主要是一个C应用程序框架&#xff0c;但它也提供了对其他一些编程语言的官方或非官方支持。以下是QT支持的一些语言版本及其特点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Python (PyQt) &#xff1a; PyQt是QT的官方Pyth…

APP广告变现,开发者对接百度广告联盟,广告变现收益如何?

百度广告联盟属于广告整合平台&#xff0c;类似的还有穿山甲、优量汇、快手联盟等。 百度广告联盟注册流程&#xff1a; 创建账户&#xff1a;填写用户基本信息&#xff0c;如&#xff1a;用户名、密码、邮箱、手机号&#xff1b; 完善财务信息&#xff1a;填写银行账号、开…