C++: Essential C++ 读书笔记:面向过程编程:调用函数。

news2024/11/17 18:24:47

1:传值和传址区别

按值传递:

  • 在调用函数中将原函数的值拷贝一份过去给被调用的函数,在被调用函数中对该值的修改,不会影响原函数的值。
  • 值传递,变量赋值,修改变量的值------修改的是新地址(复制地址)的内容,并不会影响到原来地址的数据。 
  • 在函数调用中,形参是实参内容的拷贝,并不是地址的拷贝,所以改变形参的值,并会影响实参的值。

按地址传递:

  • 在调用函数的时候将原函数的值所在的地址拷贝一份过去,被调用函数对这个地址所作的修改会影响原理的值。
  • 地址传递:用指针修改变量的值,就是把原地址中的值修改了,就相当于对实参本身进行的操作。

1.1:概述:变量的地址和地址中的内容 

首先我们要知道:变量a的地址和 变量a地址中的内容的区别,数据是存放在内存中的,每一个变量都有一个内存地址,变量的内容存放在对应内存地址的空间中。

如:定义  :

int a = 10  ;

那么a在内存中的地址是 ox1100 , 在这个地址中存储的数据就是 10 。

 

假设创建指针 p ,把a的地址赋值给 p ,就是把 a的首地址 ox1100 赋值给 指针p ,这个时候p的值就是变量a在内存中的首地址。

int a = 10;

int *p;

p = &a;

1.2 :案例:值传递  

新开辟一个内存空间,存储原理变量的值,修改变量修改的是新内存空间中的值,所以,原始的参数是不会被函数修改的。

优点: 通过值传递传的参数可以是内置类型参数:数字,字符等。原本参数的值是不会被修改的。

缺点:不能修改原参数的值。

#include<iostring>
#include<string>
uising namespace std;

void swap(int x, int y) {

    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main(){

    int a = 4, b = 6;
    printf("交换前:n  a = %d, b = %d\n", a , b);
    swap(a,b);
    printf("交换后:n  a = %d, b = %d\n", a , b);
    return 0;
}

1.3:  址传递 

址传递:就是指针传递,形参实际是指向实参地址的指针,当对形参进行操作时,就相当于对实参本身进行操作。

可以改变指针指向内容的值,但是不能改变指针本身的地址。

#include<iostream>
#include<string>
using nameapace std;

void swap(int* x, int* y) {

    int temp = *x;
    *x = *y;
    *y = temp;
}

int main(){
    int a = 4,b = 6;
    printf("交换前:a = %d ,b = %d", a, b);
    swap(&a, &b);
    printf("交换后:a = %d ,b = %d", a, b);
}

1.4:案例:面试题 :看下面面试题

#include<iostream>
#include<string>
using namespace std;

void getMemory(char*  p) {

    p = (char*) malloc(100);
}


int main(){
    char*  str = NULL;
    getMemory(str);
    // 运行会报错:程序会崩溃,没有输出(因为str 始终是 NULL)
    strccpy(str, "hello wodl");
    printf(str);
}
  • 解析:函数getMemory()  并不能动态传递内存,main函数中的 str 一直是 NULL,strcpy(str, "hello world" ); 将使程序崩溃,无法输出。
  • 其实函数getMemory()的形参p 是实参数str的一份拷贝,函数中的操作都是针对 p指向的内存地址进行的,实参之前 指向的内存地址是NULL, 后面仍然是 NULL ,所以输出 *str的值就会产生崩溃

解决方案

  • 如要要解决上述问题:我们可以将形参从 一重指针修改为 二重指针。
  • “二重指针指向一重指针的地址”: 也就是说:传递过来的即使就是 *str本身 
#include<iostream>
#include<string>
using namespace std;

void getMemory(char**  p) {

    p = (char*) malloc(100);
}


int main(){
    char*  str = NULL;
    getMemory(str);
    // 运行会报错:程序会崩溃,没有输出(因为str 始终是 NULL)
    strccpy(str, "hello wodl");
    printf(str);
}

2:函数的作用域和范围

3:动态内存管理

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

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

相关文章

智能家居加速落地,景联文科技提供数据采集标注服务

“以AI驱动智能家居&#xff0c;智能家庭助手和智能家居安防同向发展的智能物联网是目前主流趋势。高质量的标注数据能够高效训练算法&#xff0c;加速应用落地。景联文科技为相关企业提供、智能语音助手、人脸识别、指纹识别门禁系统、非法闯入检测、扫地机器人智能终端控制等…

临床资料研究中的风险因素评估相关指标

前言 写这篇文章是因为最涉及的医学相关的项目比较多&#xff0c;有些常常遇到的概念容易混淆&#xff0c;在这里着重区分一下。&#xff08;感谢广大学霸的分享&#xff09; 1. Ratio 与Rate 的区别 Ratio&#xff1a;表示相对比&#xff0c;简单理解为一个数值相对于另一个…

【1】高危漏洞利用工具 (2023.1.6更新)-- Apt_t00ls

0x01 工具介绍增加CNVD-2023-00895包括&#xff1a;泛微、蓝凌、用友、万户、致远、通达、中间件、安全设备等多个高位漏洞。泛微: e-cology workrelate_uploadOperation.jsp-RCE (默认写入冰蝎4.0.3aes) e-cology page_uploadOperation.jsp-RCE (暂未找到案例 仅供检测poc) e-…

Vivado综合属性之ASYNC_REG

本文验证了综合属性ASYNC_REG对寄存器位置的影响。 ASYNC_REG用于单bit信号采用双&#xff08;或多&#xff09;触发器实现异步跨时钟域的场合&#xff0c;此时所有用于同步的触发器都要标记ASYNC_REG。标记方式为&#xff1a; (* ASYNC_REG "TRUE" *) reg sync_0…

想在2023 年成为前端 Web 开发人员的分步指南

当我开始成为一名前端开发人员时&#xff0c;这是我希望拥有的路线图我想出了这个路线图&#xff0c;它有助于实现成为全能开发人员的目标。让我们开始吧。谁是前端开发人员&#xff1f;好的&#xff0c;现在谁是后端开发人员&#xff1f;那么如何成为一名前端开发人员呢&#…

Java 集合练习题

SourceURL:file:///home/windstorm/Documents/JAVA/JavaCoursePractise/Java 集合练习题.docx 答案&#xff1a; import java.lang.reflect.Array; import java.security.cert.CollectionCertStoreParameters; import java.util.*; public class Main { public static voi…

promise和async用法及区别(详解)

一、promisepromise的概念Promise 是异步编程的一种解决方案&#xff0c;是一个构造函数&#xff0c;自身有all、reject、resolve方法&#xff0c;原型上有then、catch等方法。特点&#xff1a;对象的状态不受外界影响。Promise对象代表一个异步操作&#xff0c;有三种状态&…

【django】模型类中数据的增删改查操作总结

文章目录一、数据库数据操作二、创建对象三、批量创建对象方法一&#xff1a;for循环迭代方法二&#xff1a;bulk_create()四、更新对象save()默认更新所有的字段指定要更新的字段一次性更新多个对象五、查询对象1、管理器2、QuerySet3、检索全部对象a、要注意&#xff1a;4、过…

01 踏上python之旅

Python是一种跨平台的、开源的、免费的、解释型的高级编程语言。它具有丰富和强大的库&#xff0c;能够把用其他语言制作的各种模块很轻松地连接在一起。所以被称为胶水语言。 python的应用领域&#xff1a; Web开发大数据处理人工智能自动化运维开发云计算爬虫游戏开发 解释…

【C语言】详解#define,#ifdef,#ifndef,#elif,#undef,以及相关运算符

1.明示常量 #define 预处理指令结尾不带&#xff1b;&#xff08;分号&#xff09;&#xff0c;在预编译的过程中使用宏的地方会进行展开&#xff0c;是用多少次就展开多少次&#xff0c;但是只替换 不计算&#xff0c;预处理器在发现程序中的宏后&#xff0c;会用宏等价的替换…

生物化学 SY002实验 最常用的酸spiric acid+阿司匹林Aspirin+从柳树皮得到水杨苷

阿司匹林已应用百年&#xff0c;成为医药史上三大经典药物之一。 小知识点&#xff1a;水杨酸的作用和阿司匹林的作用不同之处(抗凝)&#xff0c;使用时的胃损伤等 使用历史 埃及埃伯斯纸莎草纸中关于使用白柳树叶制成的混合物治疗发炎伤口的建议。&#xff08;因为柳叶和树…

软著申请你还不会?我是这样申请的

大家好&#xff0c;我是小悟 兄弟姐妹们&#xff0c;关于软著申请的话题&#xff0c;早前已经写过几篇文章的介绍了&#xff0c;包括软著的申请流程攻略和踩到被打回补正的坑&#xff0c;有兴趣的可以翻翻之前的文章&#xff0c;搜关键字【软著】就有。 私信的小伙伴来自各行…

9.Isaac教程-- Laikago 四足机器人的自主导航

Laikago 四足机器人的自主导航 开发智能机器人系统是一项多学科的工作&#xff0c;集成了动力学、控制、计算机视觉、人工智能等。 很难掌握所有这些领域。 即使你掌握了所有这些&#xff0c;也需要花费大量时间才能正确和稳健。 为了帮助机器人专家加速智能机器人的开发&…

笔试强训(12)

算法题1:计算日期到天数转换: 我们假设用例输入的是2022 1 1&#xff0c;那么我们对应的天数就是1天&#xff0c;我们就不应该在输出1月份的所有月数 public class Main {public static void main(String[] args) {Scanner scannernew Scanner(System.in);int yearscanner.next…

【uniapp小程序】上传图片

文章目录&#x1f34d;前言&#x1f34b;正文1、首先看官网uni.chooseImage(OBJECT) API 介绍2、案例代码演示3、效果展示&#x1f383;专栏分享&#xff1a;&#x1f34d;前言 本篇文章我们研究一下&#xff0c;在移动端开发过程中经常使用到的图片上传功能。在大多数小程序或…

ArcGIS基础实验操作100例--实验68注记符号化表达

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验68 注记符号化表达 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

C语言入门(四)——分支语句

if语句 if/else语句 布尔代数 switch语句 if语句 目前我们写的简单函数中可以有多条语句&#xff0c;但这些语句总是从前到后顺序执行的。除了顺序执行之 外&#xff0c;有时候我们需要检查一个条件&#xff0c;然后根据检查的结果执行不同的后续代码&#xff0c;在C语言中可…

ResNet精读笔记(1)

introduction部分提出了几个问题 1.构建一个好的网络 &#xff1f; 把层堆起来吗 哈哈 跟堆汉堡一样 这里呢 我们都知道 当网络的层数变多之后 加深了 deep了 但是 就会带来 梯度消失或者爆炸的问题 这里 实在找不到好的图 本质上因为当层数多了之后 反向传播的计算里面是…

嵌入式:万字详解通信接口设计

文章目录UART接口UART的工作原理UART的功能和组成S3C2410A的UARTUART 操作&#xff08;1&#xff09;数据发送&#xff08;2&#xff09;数据接收&#xff08;3&#xff09;自动流控制&#xff08;4&#xff09;非自动流控制&#xff08;a&#xff09;接收数据操作&#xff08;…

【C++】模拟实现List的正向和反向迭代器(iterator、reverse_iterator)

文章目录1、搭建List的基本框架2、List中iterator和const_iterator3、反向迭代器revser_iterator1、搭建List的基本框架 STL中List容器底层是一个双向带头循环链表。 这里简单搭建一个List&#xff0c;下面我们不断完善。 思路&#xff1a; 1、List作为一个双向带头链表&…