应注意问题:

当指针作为函数的参数进行传递的时候,本质上还是进行的“值传递”,也就是复制了一个新的指向该地址的指针变量。

只有在被调函数中,对指针进行引用操作,才可以达到不需要返回值,就对指针指向的变量做出相应的变化。

下面分析这样两个例子;

要求:定义并初始化两个字符串变量,并执行输出操作;然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现。

程序1.1

#include<iostream>
#include<string>
using namespace std;
int main(){
string str1="I love China!",str2="I love JiNan!";
void Exchange(string *p1,string *p2);
cout<<"str1: "<<str1<<endl;
cout<<"str2: "<<str2<<endl;
Exchange(&str1,&str2);
cout<<"str1: "<<str1<<endl;
cout<<"str2: "<<str2<<endl;
return 0;
}
void Exchange(string *p1,string *p2){
string *p3;
p3=p1;
p1=p2;
p2=p3;
}

输出结果:

程序1.2

#include<iostream>
#include<string>
using namespace std;
int main(){
string str1="I love China!",str2="I love JiNan!";
void Exchange(string *p1,string *p2);
cout<<"str1: "<<str1<<endl;
cout<<"str2: "<<str2<<endl;
Exchange(&str1,&str2);
cout<<"str1: "<<str1<<endl;
cout<<"str2: "<<str2<<endl;
cout<<endl;
return 0;
}
void Exchange(string *p1,string *p2){
string p3;
p3=*p1;
*p1=*p2;
*p2=p3;
}

输出结果:

分析:

通过这两个程序的结果对比,程序1.1中的函数没有达到交换数值的目的,而程序1.2达到了;

因为,在主函数中,主函数把str1和str2的首元素的地址,作为实参传递给了函数Exchange函数;Exchange函数中的,p1用于接收str1的地址,p2用于接收str2的地址,这个过程是进行了值传递。

在程序1.1中,只是指针p1和指针p2的值进行了交换,对原来的字符串str1和str2并没有什么影响;而在程序1.2中,是*p1和*p2的值进行了交换,而*p1就是str1它本身,*p2就是str2它本身,所以实际上是str1和str2进行了交换

C++指针作为函数的参数进行传递时注意的问题的更多相关文章

  1. js函数中参数的传递

    数据类型 在 javascript 中数据类型可以分为两类: 基本类型值 primitive type,比如Undefined,Null,Boolean,Number,String. 引用类型值,也就 ...

  2. keil 中用函数指针调用函数的参数限制

    NSIC中,通过函数指针调用的函数的参数的个数没有限制,但是KeilC对此有限制,至多3个参数.因为,KeilC编译时,无法通过函数指针找到该函数的局部数据段,也就无法通过局部数据段传递参数,只能通过 ...

  3. 《从零开始学Swift》学习笔记(Day 20)——函数中参数的传递引用

    原创文章,欢迎转载.转载请注明:关东升的博客 参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以 ...

  4. python函数中参数的传递

    Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本类型按值传递 ...

  5. python中定义函数和参数的传递问题

    作者:達聞西链接:https://zhuanlan.zhihu.com/p/24162430来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 5.2.4 函数.生成器和类 ...

  6. [GO]指针和函数配合的值传递

    package main import "fmt" func swap(a, b int) { a, b = b, a fmt.Printf("a = %d, b = % ...

  7. laravel中当使用Elquent ORM中的模型作为参数进行传递时的方法:

    Controller中的函数: /* $modelArg:是调用模型的路径,以字符串的形式传递过来. $id:要查询当前模型的id号. $args:具体查询的字段 */ public function ...

  8. Matlab中 awgn 函数输入参数带有‘measured’ 时snr的含义

    MATLAB中awgn 函数可以为输入信号x 添加一定大小的噪声. out = awgn(in,snr,'measured');  是一种常见的使用方法,意思是在添加噪声前先测量一下输入信号的功率,再 ...

  9. laravel控制器方法中,用函数作为变量进行传递时的处理方法

    本人在做上传图片时,里面执行的方法时一致的,只是个别地方不同,这种情况下,就需要把公用的部分提取出来,把不同的地方放到回调函数种去. StudentController中的方法: public fun ...

随机推荐

  1. 算法之python创建链表实现cache

    算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...

  2. queue容器

    一.queue特性 queue是一种先进先出(first in first out,FIFO)的数据结构,它有两个口,数据元素只能从一个口进,从另一个口出.队列只允许从队尾加入元素,队头删除元素,必须 ...

  3. Genymotion的使用 -- A Faster Android Emulator

    Genymotion 安装与配置 1,Genymotion 模拟器 EditText获取焦点时不自动弹出软件盘 选择该模拟器的设置--> 选中Use Virtual keyboard for t ...

  4. visualvm-profile以及远程访问

    使用visualvm的Profiler功能,可以提供两方面的性能跟踪功能: Profile 一个是CPU,可以跟踪每个方法占用CPU的时长:比如你在发现CPU持续走高的时候可以通过Profile的CP ...

  5. 根据VM的TAG开停机

    公有云一个非常大的优势,就是可以根据需求进行开停机.由于计费是按时进行的,从而实现节省成本. Azure上用脚本按时开停机已经有很多部署的案例.本文将介绍采用VM Tag中规定的时间进行开停机的脚本. ...

  6. Spring单例Bean和线程安全

    Spring的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢?例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spring框 ...

  7. Mysql教程:[1]下载安装配置详细教程

    如果不小心你下载了免安装的mysql,那么你比较倒霉,你找不到setup文件,还得自己去配置很多东西,然后再使用命令安装.所以我今天呢写一篇教程,写的尽量详细,即便是菜鸟也能安装,我自己安装过很多遍了 ...

  8. Python多进程-进程间数据的共享

    不同的进程不能同时修改一份数据,但是不同的进程能对一份数据进行修改 可通过Manager来实现进程间的数据共享 # -*- coding:utf-8 -*- __author__ = "Mu ...

  9. C#一般处理程序 ashx.cs使用Session报错问题

    HttpContext.Current.Session["UserID"].ToString();//报错,报Session为Null, 此时需要添加引用和继承IRequiresS ...

  10. Shell编程进阶 1.9 while循环

    while 死循环 vim while.sh #!/bin/bash ## while : do date +%T sleep done : 永久帧 查看时间 3秒循环1次 打印1-10 #!/bin ...