`
Qaohao
  • 浏览: 260277 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

C++与Java之函数参数传递

阅读更多
    学过编译原理以后,我们都知道函数的参数传递有两种,分别是值传递和引用传递(又叫地址传递)。

    值传递,函数只调用时,只是将实参的值拷贝到形参中,在函数里面操作都是针对形参,而在函数调用完毕以后形参所占的空间会被释放,这样在调用前后不会对实参的值产生任何影响。
   
    引用传递,又叫地址传递。顾名思义,那就是在函数调用时,将实参的地址传给形参,换句话说就是实参和形参在内存共用了一片空间,因此在函数中修改形参的值也就同时修改了实参的值。

    目前接触过语言C/C++、Java对函数参数传递的支持情况:
语言 值传递 引用传递
C/++ 支持 支持
Java 支持 不支持

   
    现在就以C++语言为例,谈谈自己对函数参数传递的一些认识。在网上看了好多文章,还有很多书中对将C++的参数传递分为三种,在上面说的那两种的基础上又多出了一个指针传递。大家知道通过指针传递也可以修改实参的值,所以大家可能也有一种误解指针传递是引用传递。下面我通过一个例子来说明我自己对指针传递的理解。

#include <iostream>
using namespace std;

typedef char* String ;
String strCopy(String destStr, const String srcStr) {
	if (srcStr) {
		int len = strlen(srcStr);
		destStr = new char[len+1];

		String tmpDestStr = destStr;
		String tmpSrcStr = srcStr;
		while(*tmpDestStr++ = *tmpSrcStr++);
		tmpDestStr = '\0';
		
		return destStr;
	} else {
		return NULL;
	}
}
void main() {
	String testStr =;
	strCopy(testStr, "aaaa");
	cout<<testStr<<endl;
}


    如果是引用传递上面那段代码执行的结果应该是aaaa,但实际在执行结果是bbbb。从上面的例子可以看出C/C++中的指针传递实际上也是值传递,其实指针是一种特殊的变量,它的内容是一个变量的地址,我们在指针传递时不能修改指针指向的地址,但是能修改指针指向的地址里面的内容。

    从上面那个函数可以看出,实际上是想实现一个字符串拷贝,想把字符串srcStr中的内容拷贝到destStr中,但是指针传递实际是值传递,因此达不到预期的目的,可以做以下修改,达到目的。

方法一:
String strCopy(String& destStr, const String srcStr) {	
	if (srcStr) {
		int len = strlen(srcStr);
		destStr = new char[len+1];

		String tmpDestStr = destStr;
		String tmpSrcStr = srcStr;
		while(*tmpDestStr++ = *tmpSrcStr++);
		tmpDestStr = '\0';
		
		return destStr;
	} else {
		return NULL;
	}
}

方法二:
#include <iostream>
using namespace std;

typedef char* String ;
String strCopy(String destStr, const String srcStr) {
	if (srcStr) {
		String tmpDestStr = destStr;
		String tmpSrcStr = srcStr;
		while(*tmpDestStr++ = *tmpSrcStr++);
		tmpDestStr = '\0';
		return destStr;
	} else {
		return NULL;
	}
}
void main() {
int len = strlen("aaaa");
	String testStr =; new char[len+1];
	strCopy(testStr, "aaaa");
	cout<<testStr<<endl;
}

    此外还有像在C++或者Java中的方法中传递对象时,其实也是值传递,表面上你在函数调用时可以修改传入对象的状态,但是实际对象没有发生改变。
0
0
分享到:
评论

相关推荐

    C、C++函数参数传递方式.pdf

    C、C++函数参数传递方式.pdf

    ocos2d-x 通过JNI实现c/c++和Android的java层函数互调

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一...

    NDKC调用Java函数传参或获取变量

    NDK开发时,C/C++调用Java的函数的一些案例; 传递int类型参数: https://blog.csdn.net/niuba123456/article/details/80978500 传递String类型参数: https://blog.csdn.net/niuba123456/article/details/80978916 ...

    JNI技术手册 c/c++调用java

    2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是...

    定义一个圆类circle,它有一个变量radius(半径)。从键盘输入数据,通过构造函数的参数传递给radius,编程计算并输出圆的的周长和面积。但是,必须确保输入的数据不为复数。

    定义一个圆类circle,它有一个变量radius(半径)。从键盘输入数据,通过构造函数的参数传递给radius,编程计算并输出圆的的周长和面积。但是,必须确保输入的数据不为复数。

    使用Java Native Interface调用本地C++代码.txt

    在这个例子中,我们使用Java Native Interface(JNI)来调用本地的C++代码。首先,我们需要在Java类中声明一个native方法,并使用`native`...这些参数可以让我们方便地在Java和C++之间传递数据和调用其他本地方法。

    C++复习资料之系列

    在一个C++程序中,main函数的位置( c )。 (a) 必须在程序的开头 (b) 必须在程序的后面 ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) ...

    javascript函数中参数传递问题示例探讨

    相信每一位刚接触javascript的同学在函数...这是多么爽的一件事情,学过c++/c#或者java的同学可能就会想到函数重载。但是,我要告诉你的是,javascript中不存在函数重载,如果你定义了两个同名函数,那么先定义的函数将

    Java函数与数组实验源代码

    数组存储结构。一维数组、多维数组以及交错数组的定义与使用。 数组如何实例化?Java中的数组与以前的C++中定义的...4、理解方法定义的优势,加深对方法的参数传递与返回类型的理解。 5、了解递归的概念及实现特点。

    Java闭包 Java闭包

    在2013年发布的 JavaSE8 中包含一个叫做 ...闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试着放一些样例程序来解释一些概念和语法。

    C/C++和Java达到swap不同功能

    首先我们来看看c/c++实施swap性能  void swap ( int & a, int & b)  {  int Temp;  temp = a;  a = b;  b = temp;...  那么在java中是否还能这样呢。非常显然java中没有地址引用...  在Java世界中函数

    C++编程思想 (作者学习C++亲身体会及多年教学经验)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    JNI完全技术手册 带完整书签

    Chap7:Jni中C++和Java的参数传递... 33 Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载...

    C++编程思想1-5 清晰PDF

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    Python 变量的引用-调用函数传递实参的引用

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    C++编程思想(中文版)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    java 编程入门思考

    1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 ...

    Java初学者入门教学

    1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 ...

    java联想(中文)

    1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 ...

    即时消息传递系统编程源代码

    即时消息传递的常用函数的介绍和使用(转)

Global site tag (gtag.js) - Google Analytics