`
Qaohao
  • 浏览: 261688 次
  • 性别: 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
分享到:
评论

相关推荐

    Java的引用和函数参数传递

    ### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...

    Jni中C++和Java的参数传递

    在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...

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

    C和C++中的函数参数传递方式主要分为值传递、指针传递和引用传递。这些方式决定了参数在函数调用时的传值行为,以及它们在函数执行后是否能够影响原始数据。下面详细解释这些传递方式的知识点。 1. 值传递(Call by...

    C与C++中的函数参数传递机制

    ### C与C++中的函数参数传递机制 #### 引言 在C与C++编程语言中,函数参数的传递方式是程序设计中的一个重要概念。它不仅直接影响到函数内部如何处理这些参数,还决定了函数调用时对原始数据的影响。本文将深入...

    在Qt平台C++和Java代码的交互

    在Qt中,可以使用QProcess或其他I/O组件来启动JVM并传递参数,以执行Java代码。同时,可以使用信号和槽机制来协调C++和Java之间的事件处理。 为了在实际项目中实现这一功能,你可能需要考虑更多的细节,比如错误...

    java 中函数的参数传递详细介绍

    在Java编程语言中,函数参数传递机制是一个关键概念,它涉及到如何在方法内部操作传入的参数。根据Java的特性,参数传递分为两种主要类型:值传递和引用传递。下面我们将详细探讨这两种传递方式以及它们在不同数据...

    《C++ for Java Programmers》高清完整英文PDF版

    这部分涉及到Java与C++内存模型的差异,C++中的指针概念、内存堆管理、new与delete操作符、野指针、双重删除、返回指针的函数以及箭头(-&gt;)操作符的使用。 知识点六:标准模板库(STL)。书中强调了STL的重点内容...

    Jni中C++和Java的参数传递.pdf

    使用`javah`工具,针对编译后的`.class`文件,可以生成与Java本地方法对应的C/C++头文件。例如: ```bash javah -classpath E:\work\java\workspace\JavaJni com.sundy.jnidemo.ChangeMethodFromJni ``` 这将生成`...

    C++调用Java接口

    最后,在Java代码中,创建`JavaInterface`的实例,并通过反射调用`callFromCpp`方法,传递参数并执行C++代码。 9. **示例项目“CInvokJava”** “CInvokJava”项目很可能是包含上述步骤实现的一个具体示例,包括...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用传递以及C++中的指针传递,并通过具体的代码示例来帮助理解这些概念。 #### 值传递 值传递是最简单的参数传递方式之一,它指...

    java及C++中传值传递、引用传递和指针方式的理解

    值传递与Java类似,只是C++允许对基本数据类型进行直接复制。引用传递类似于Java中的引用,但它不像Java那样创建引用副本,而是直接提供原始对象的别名。这意味着对引用参数的任何修改都会影响原始对象,如`ByRef`...

    参数传递的总结——构造函数

    在编程领域,参数传递是我们在编写函数或方法时必须了解的基本概念。本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    在C++中,你可能需要提供一个辅助函数来处理Java传递过来的一维数组,转换为C++的二维数组格式。 此外,对于大型数据结构,考虑到性能问题,可能需要考虑使用直接内存映射(Direct Memory Mapping)或者自定义类型...

    C++库封装JNI接口-实现java调用c++

    在跨平台的软件开发中,有时我们需要...这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种语言之间传递参数和返回值。熟练掌握JNI可以极大地扩展Java应用的功能,尤其是在需要高性能计算或利用硬件特性时。

    Qt for Android 用JNI来使C++和Java互调(目前最新版全网只有这个可用)

    "Qt for Android 用JNI来使C++和Java互调"的主题揭示了如何利用JNI(Java Native Interface)技术在Qt与Android原生系统之间建立桥梁,实现两者的交互。以下将详细介绍这一过程。 首先,Qt for Android是Qt项目的一...

    Jni中C和Java的参数传递.doc

    首先,我们需要定义与 Java 对应的数据类型,并且创建一个转换函数,将 Java 的对象转换为 C++ 的结构体: ```c++ #include #include "DiskInfoJava.h" // 包含自动生成的头文件 // 定义 C++ 的 DiskInfo 结构体 ...

    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 ...

    C++与Java混合编程.docx

    C++程序通过JNI调用Java方法,传递参数和接收返回值。 在混合编程中,字符串处理是一个关键点,因为Java的字符串默认使用UTF-8编码,而在C++中可能需要进行编码转换以避免乱码问题。JNI提供了一些辅助函数,如`...

    概观C++与java程序设计语言的特征

    ### 概观C++与Java程序设计语言的特征 随着计算机技术的发展,程序设计语言越来越多,其中C++和Java可以说是目前应用最为广泛的语言之一,这与其优良的特性密不可分。本文将着重探讨这两种程序语言的特征,分别总结...

Global site tag (gtag.js) - Google Analytics