学过编译原理以后,我们都知道函数的参数传递有两种,分别是值传递和引用传递(又叫地址传递)。
值传递,函数只调用时,只是将实参的值拷贝到形参中,在函数里面操作都是针对形参,而在函数调用完毕以后形参所占的空间会被释放,这样在调用前后不会对实参的值产生任何影响。
引用传递,又叫地址传递。顾名思义,那就是在函数调用时,将实参的地址传给形参,换句话说就是实参和形参在内存共用了一片空间,因此在函数中修改形参的值也就同时修改了实参的值。
目前接触过语言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中的方法中传递对象时,其实也是值传递,表面上你在函数调用时可以修改传入对象的状态,但是实际对象没有发生改变。
分享到:
相关推荐
### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...
在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...
C和C++中的函数参数传递方式主要分为值传递、指针传递和引用传递。这些方式决定了参数在函数调用时的传值行为,以及它们在函数执行后是否能够影响原始数据。下面详细解释这些传递方式的知识点。 1. 值传递(Call by...
### C与C++中的函数参数传递机制 #### 引言 在C与C++编程语言中,函数参数的传递方式是程序设计中的一个重要概念。它不仅直接影响到函数内部如何处理这些参数,还决定了函数调用时对原始数据的影响。本文将深入...
在Java编程语言中,函数参数传递机制是一个关键概念,它涉及到如何在方法内部操作传入的参数。根据Java的特性,参数传递分为两种主要类型:值传递和引用传递。下面我们将详细探讨这两种传递方式以及它们在不同数据...
这部分涉及到Java与C++内存模型的差异,C++中的指针概念、内存堆管理、new与delete操作符、野指针、双重删除、返回指针的函数以及箭头(->)操作符的使用。 知识点六:标准模板库(STL)。书中强调了STL的重点内容...
在Qt中,可以使用QProcess或其他I/O组件来启动JVM并传递参数,以执行Java代码。同时,可以使用信号和槽机制来协调C++和Java之间的事件处理。 为了在实际项目中实现这一功能,你可能需要考虑更多的细节,比如错误...
使用`javah`工具,针对编译后的`.class`文件,可以生成与Java本地方法对应的C/C++头文件。例如: ```bash javah -classpath E:\work\java\workspace\JavaJni com.sundy.jnidemo.ChangeMethodFromJni ``` 这将生成`...
最后,在Java代码中,创建`JavaInterface`的实例,并通过反射调用`callFromCpp`方法,传递参数并执行C++代码。 9. **示例项目“CInvokJava”** “CInvokJava”项目很可能是包含上述步骤实现的一个具体示例,包括...
本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用传递以及C++中的指针传递,并通过具体的代码示例来帮助理解这些概念。 #### 值传递 值传递是最简单的参数传递方式之一,它指...
值传递与Java类似,只是C++允许对基本数据类型进行直接复制。引用传递类似于Java中的引用,但它不像Java那样创建引用副本,而是直接提供原始对象的别名。这意味着对引用参数的任何修改都会影响原始对象,如`ByRef`...
在编程领域,参数传递是我们在编写函数或方法时必须了解的基本概念。本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递...
在C++中,你可能需要提供一个辅助函数来处理Java传递过来的一维数组,转换为C++的二维数组格式。 此外,对于大型数据结构,考虑到性能问题,可能需要考虑使用直接内存映射(Direct Memory Mapping)或者自定义类型...
在跨平台的软件开发中,有时我们需要...这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种语言之间传递参数和返回值。熟练掌握JNI可以极大地扩展Java应用的功能,尤其是在需要高性能计算或利用硬件特性时。
"Qt for Android 用JNI来使C++和Java互调"的主题揭示了如何利用JNI(Java Native Interface)技术在Qt与Android原生系统之间建立桥梁,实现两者的交互。以下将详细介绍这一过程。 首先,Qt for Android是Qt项目的一...
首先,我们需要定义与 Java 对应的数据类型,并且创建一个转换函数,将 Java 的对象转换为 C++ 的结构体: ```c++ #include #include "DiskInfoJava.h" // 包含自动生成的头文件 // 定义 C++ 的 DiskInfo 结构体 ...
cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一...
NDK开发时,C/C++调用Java的函数的一些案例; 传递int类型参数: https://blog.csdn.net/niuba123456/article/details/80978500 传递String类型参数: https://blog.csdn.net/niuba123456/article/details/80978916 ...
C++程序通过JNI调用Java方法,传递参数和接收返回值。 在混合编程中,字符串处理是一个关键点,因为Java的字符串默认使用UTF-8编码,而在C++中可能需要进行编码转换以避免乱码问题。JNI提供了一些辅助函数,如`...
### 概观C++与Java程序设计语言的特征 随着计算机技术的发展,程序设计语言越来越多,其中C++和Java可以说是目前应用最为广泛的语言之一,这与其优良的特性密不可分。本文将着重探讨这两种程序语言的特征,分别总结...