C++ 函数的参数传递可以分为:值传递和引用传递。

两者的最大区别也很简单,如果该函数的参数只是读的话,值传递就可以满足。如果该函数的参数需要进行修改并返回的时候,就应该进行引用传递。

C++指针作为参数也遵循以上原则,先来看几个例子:

void test1(int *p) {
*p = ;
} int main() { int a = ; int *p = &a; std::cout << *p << std::endl; test1(p); std::cout << *p << std::endl; return ;
}
//结果为:1 5 void test2(int *p) {
int b = ;
p = &b;
} int main() { int a = ; int *p = &a; std::cout << *p << std::endl; test2(p); std::cout << *p << std::endl; return ;
} //结果为: 1 1 void test3(int *&p) {
int b = ;
p = &b;
} int main() { int a = ; int *p = &a; std::cout << *p << std::endl; test3(p); std::cout << *p << std::endl; return ;
} //结果为:1 5

通过以上三种测试,我们可以发现指针作为参数形参传递的一个基本原理:

指针作为函数的参数,可以修改指针地址指向的值,并且能够正确返回,但是无法通过直接修改指针的地址来改变指针的返回,因为指针参数当中,指针的地址是值传递,无返通过修改值传递得到正确返回。如果想通过修改指针的地址来修改指针的返回结果,需要通过引用传递,则必须将指针改为指针的引用作为函数参数,如void test3(*& p)函数一样。

另外还有一种方法需要思考一下,既然的指针作为参数,其地址是值传递,不能进行修改地址而得到有效返回,但是我们可以修改指针地址指向的值,进行有效返回。既然如果,我们可以在指针参数的基础上再加一个指针,这样原指针就是指针地址指向的值了,可以进行修改返回,具体代码可以如下所示:

void test4(int **p) {
int b = ;
*p =&b;
} int main() { int a = ; int *p=&a; std::cout << *p << std::endl; test(&p); std::cout << *p << std::endl; return ;
}
//结果为:1 5

C++ 指针形参和指针引用形参的原理分析的更多相关文章

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

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

  2. C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份拷贝)

    先看一个例子:这个程序为什么会崩溃? #include <stdio.h> #include <stdlib.h> int f(int *q) { ; q = (int*)ma ...

  3. C++中函数的形参为数组时,实质形参是指针

    C++中函数的形参如果为数组的话,那么进行实参传递时,实参实际上换转化成指针.参考下面的例子: #include<iostream> using namespace std; void f ...

  4. 临时变量不能作为非const类型引用形参的实参

    摘要:     非const 引用形参只能与完全同类型的非const对象关联.      具体含义为:(1)不能用const类型的对象传递给非const引用形参:                  ( ...

  5. c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针

    1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] ...

  6. C/C++中指针和java的引用区别

    C++指针  要区分指针变量和指针变量所指对象. 指针变量先是一个变量,它有自己的地址和存储的内容,所以要想清楚是改变指针变量的值(即地址),还是改变指针变量所指对象的值. #include < ...

  7. C++中函数参数传递(非引用形参和引用形参)——学习笔记

    1.非引用形参-copy 指针是非引用,copy.但值也会改变. 引用形参: const相关问题: const形参可以拷贝. 不能修改,不能赋值! 可以使用const初始化非const: 指针+con ...

  8. C++学习笔记(五)--指针、NULL、引用

    1. C++中已经定义了NULL为0:#define NULL 0 指针p可以指向空值NULL即 p = NULL;表示该指针变量不指向任何变量. 注意:指针未初始化与指针为NULL不同, p = N ...

  9. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

随机推荐

  1. 解决IE和firefox 下flash盖住div的问题(转载)

    原文地址:http://www.oschina.net/question/171410_26563 做的企业站 顶部是flash的滚动图片. 右侧是在线客户,但是flash盖住了在线客户的div 网上 ...

  2. FZU 2020 组合 (Lucas定理)

    题意:中文题. 析:直接运用Lucas定理即可.但是FZU好奇怪啊,我开个常数都CE,弄的工CE了十几次,在vj上还不显示. 代码如下: #pragma comment(linker, "/ ...

  3. vue中使用element写点击input内部标签(使用模态框传值)

    首先附上源码地址 https://files.cnblogs.com/files/maruihua/vue-tagsinput-master.zip 这个是我修改后的代码.取消了部分功能,添加的一些功 ...

  4. 从Oracle9i RMAN全库备份迁移到 Oracle10g

    1. 创建以下目录: mkdir -pv $ORACLE_BASE/admin/$ORACLE_SID/{{a,b,c,dp,u}dump,pfile} mkdir -pv $ORACLE_BASE/ ...

  5. $Edmonds-Karp$[网络流]

    \(原题戳这里\) >最大流最小割定理$(Maximum Flow, Minimum Cut Theorem): $ 网络的最大流等于最小割 具体的证明分三部分 1.任意一个流都小于等于任意一个 ...

  6. LightOj 1236 Pairs Forming LCM (素数筛选&&唯一分解定理)

    题目大意: 有一个数n,满足lcm(i,j)==n并且i<=j时,(i,j)有多少种情况? 解题思路: n可以表示为:n=p1^x1*p2^x1.....pk^xk. 假设lcm(a,b) == ...

  7. JetSpeed2部署至Apusic操作步骤记录

    JetSpeed2部署至Apusic操作步骤记录. 1.创建Apusic新域,配置端口.管理端口和管理密码. 2.将Tomcat/lib目录中的所有jar包复制至Apusic域中的lib目录中(包括数 ...

  8. AngularJS ng-repeat下使用ng-model

    1 2 3 blue:<input type="radio" value="1" ng-model="selectValue"/> ...

  9. 安装CentOS--设置网络_1

    (1)在登录黑框中输入如下命令,让CentOS 7自动获取一个IP地址: # dhclient (2)正常情况下不会有任何输出内容.用如下命令查看获取到的IP地址: # ip addr 它将返回如图所 ...

  10. 【CSS】3种CSS方法设置元素垂直水平居中

    1. 宽高固定 设置要水平垂直居中的 div 的 position 为 absolute,left:50%; margin-left为负的这个元素宽度的一半,同理,top:50%;margin-top ...