学过编译原理以后,我们都知道函数的参数传递有两种,分别是值传递和引用传递(又叫地址传递)。
值传递,函数只调用时,只是将实参的值拷贝到形参中,在函数里面操作都是针对形参,而在函数调用完毕以后形参所占的空间会被释放,这样在调用前后不会对实参的值产生任何影响。
引用传递,又叫地址传递。顾名思义,那就是在函数调用时,将实参的地址传给形参,换句话说就是实参和形参在内存共用了一片空间,因此在函数中修改形参的值也就同时修改了实参的值。
目前接触过语言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中的方法中传递对象时,其实也是值传递,表面上你在函数调用时可以修改传入对象的状态,但是实际对象没有发生改变。
分享到:
相关推荐
C、C++函数参数传递方式.pdf
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 ...
2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是...
定义一个圆类circle,它有一个变量radius(半径)。从键盘输入数据,通过构造函数的参数传递给radius,编程计算并输出圆的的周长和面积。但是,必须确保输入的数据不为复数。
在这个例子中,我们使用Java Native Interface(JNI)来调用本地的C++代码。首先,我们需要在Java类中声明一个native方法,并使用`native`...这些参数可以让我们方便地在Java和C++之间传递数据和调用其他本地方法。
在一个C++程序中,main函数的位置( c )。 (a) 必须在程序的开头 (b) 必须在程序的后面 ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) ...
相信每一位刚接触javascript的同学在函数...这是多么爽的一件事情,学过c++/c#或者java的同学可能就会想到函数重载。但是,我要告诉你的是,javascript中不存在函数重载,如果你定义了两个同名函数,那么先定义的函数将
数组存储结构。一维数组、多维数组以及交错数组的定义与使用。 数组如何实例化?Java中的数组与以前的C++中定义的...4、理解方法定义的优势,加深对方法的参数传递与返回类型的理解。 5、了解递归的概念及实现特点。
在2013年发布的 JavaSE8 中包含一个叫做 ...闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试着放一些样例程序来解释一些概念和语法。
首先我们来看看c/c++实施swap性能 void swap ( int & a, int & b) { int Temp; temp = a; a = b; b = temp;... 那么在java中是否还能这样呢。非常显然java中没有地址引用... 在Java世界中函数
全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...
Chap7:Jni中C++和Java的参数传递... 33 Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载...
全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...
Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...
全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...
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 ...
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 ...
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 ...
即时消息传递的常用函数的介绍和使用(转)