(以下均为个人理解)

函数访问的传参两种方式大致为:

  1. 值传递;
  2. 地址传递。

但是实际上可以都理解为,传进来的【形参】是主函数里的实参值的【一种复制】。

举个例子,哪怕我们将地址作为子函数的输入变量,形参依然只是一种复制,只在子函数运行期间存在:

#include <stdio.h>
#include <stdlib.h> void swap(int* a, int* b)
{
printf("a is %p, b is %p\n", a, b);
int* t = a;
a = b;
b = t;
printf("a is %p, b is %p\n", a, b);
printf("a is %d, b is %d\n", *a, *b);
} int main()
{
int a = 5, b = 10;
swap(&a, &b);
printf("a is %d, b is %d\n", a, b);
system("pause");
}

可以看到,在函数运行的过程中,a=5和b=10两个int数字的地址都被成功传入,并且完成了交换。

但是因为地址交换只发生在了子函数中。



所以仅仅是地址的交换对于主函数中值修改是无意义的

那么为什么可以通过指针作为参数交换变量。



参考上面这段代码,这段代码没有改变传进来的a和b的地址,而是改变了a和b指针指向的值

所以在函数运行后什么会保存。

指针指向的值。

也就是【指针】和【指针指向的内存里存储东西】的映射关系会被保存。

并不是牵扯到地址就会决定性地改变变量。

也就是,只有改变值才会被保存。

考虑到我们之前接触过的【结构体指针】。

指针作为传参形式的好处是可以节约空间。

根据我们上文中提到的子函数的形参是实参的一份复制来看,无论什么放在里面都是复制了那一份实参作为形参。

而拷贝指针,就可以只拷贝很少的空间。

再来说【数组】。

子函数中,对于数组的【修改】(非只读,包含写)都是会修改主函数的值的。

我理解为【数组操作】就是对于数组的地址中的内容进行修改。

因此子函数中对数组的操作会对主函数中产生影响。

再说C++的引用。

C++中的引用使用方式大致如下:

#include <iostream>
#include <stdlib.h>
using namespace std; void swap2(int& a, int& b)
{
int t = a;
a = b;
b = t;
} int main()
{
int a = 3, b = 4;
swap2(a, b);
cout << a << " " << b << endl;
system("pause");
}

引用看起来就很简单,对于需要修改值的形参传入的时候在前面写&,不需要的不写就行了。

【总结】

  1. 函数形参都是暂存量,只有修改指针的指向关系(地址->值的映射关系)才会被保存,也是看起来使用地址、使用指针能让子函数修改主函数值的原因。
  2. 引用使用起来最方便。

【更新】

考虑全局变量的存在,其实主函数中的变量只是存在了主函数时间的变量。

【C/C++】指针,传参,引用的一些个人理解。的更多相关文章

  1. [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参

    个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...

  2. c/c++指针传参

    首先要理解参数传递,参数传递分值传递,指针传递,引用传递.(就我自己理解,就是把实参对形参进行赋值) 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单 ...

  3. C和C++引用传递和数组传参引用

    引用传递有两种传参方式,具体可参考文章 概括地讲,就是 *声明一个形参是指针,所以需要传递指针实参,对应的函数实现也应当遵循指针的语法.这种实现思路并不针对于C或者C++,因为它们都有指针,所以都可以 ...

  4. python 传值引用和传参引用

    调用同事的函数,传入goods_list,获取商品信息,然后将商品信息与goods_list的信息进行匹配,合并. 但是同事返回数据的同时改变了我传入的参数,goods_list.相当于传参引用,也就 ...

  5. C++单纯的指针传参的问题

    C++指针传参也是单纯的复制一份地址,如下代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace st ...

  6. C++的结构体指针传参

    typedef struct node{int n;node *left;}*tnode; 传参的时候注意用** void init(node **nn);int main(){tnode nna;i ...

  7. python3.x 类似cpp引用指针传参修改

    #同名局部变量调用外部全局变量: num=100def fun(): global num#告诉编译器是全局的num num+=100 print(num)print(fun)print(fun()) ...

  8. C++二级指针和指针引用传参

    前提 一级指针和引用 已经清晰一级指针和引用. 可参考:指针和引用与及指针常量和常量指针 或查阅其他资料. 一级指针和二级指针 个人觉得文字描述比较难读懂,直接看代码运行结果分析好些,如果想看文字分析 ...

  9. C++ 传参的方式 值传递,指针传递,引用传递

    关于传参总是搞晕,这里总结下: 值传递: void func(int n) { } void main() { int x = 1; func(x); return; } 这种就是值传递,在func函 ...

随机推荐

  1. Linux基础三:用户和组

    三.用户和组 1.概念 (1).用户概念: 用户是用来运行某一些进程.拥有某一些文件或目录. 在Linux里面,用户分成三大类:root用户.系统用户.普通用户. 用户是用UID来唯一标识身份的,且r ...

  2. Django 小实例S1 简易学生选课管理系统 11 学生课程业务实现

    Django 小实例S1 简易学生选课管理系统 第11节--学生课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,学生需要拥 ...

  3. Qt Creator 源码学习笔记01,初识QTC

    阅读本文大概需要 4 分钟 Qt Creator 是一款开源的轻量级 IDE,整个架构代码全部使用 C++/Qt 开发而成,非常适合用来学习C++和Qt 知识,这也是我们更加深入学习Qt最好的方式,学 ...

  4. 关于新手使用mpb开发代码的一些小知识

    mac 前端端口占用解决   1.查看8080端口,复制进程PID  lsof -i :8080 2.杀死进程 kill -9 「进程PID」   如果你的mac不能使用sudo解决办法   错误提示 ...

  5. RabbitMQ Network Partitions 处理策略

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 网络分区的意义 RabbitMQ的模型 ...

  6. [bzoj1391]order

    考虑最小割,即最少要去掉多少收益先S向所有机器连边,流量为购买费用:所有机器向工作连边,流量为租借费用:工作向T连边,流量为收益那么对于每一个工作,要么割掉连向T的边,要么购买/租借所有机器,同时由于 ...

  7. 应用SpringAOP及Tlog工具完成日志链路追踪、收集、持久化

    一.痛点 目前我司各系统的日志管理比较原始,使用logback打日志到log文件,虽然有服务管理平台,但记录的日志也仅仅是前置机调用后台系统的出入参,当遇到问题时查日志较为麻烦. 登录VPN-打开服务 ...

  8. 通过 for 循环,比较 Python 与 Ruby 编程思想的差别

    作者:Doug Turnbull 译者:豌豆花下猫@Python猫 原文:https://softwaredoug.com/blog/2021/11/12/ruby-vs-python-for-loo ...

  9. 删除本地仓库中的lastUpdated文件.bat

    @echo off @ ECHO. @ ECHO. @ ECHO. 说 明 @ ECHO ------------------------------------------------------- ...

  10. 整理记录一些好用的随机图API

    最近自己博客使用的随机图API有些不稳定,自己又去搜集了一些有意思的随机图API,这里做一个整理记录 注意!!!本文链接最后测试时间----2021年11月21日 主题作者Tagaki的API(有时候 ...