- 我是从C++语言开始学习的,然后在学到JAVA的时候发现JAVA声称自己的参数传递只有按值传递,这让我就很头疼,准备慢慢的来分析下,看官觉得有不对的地方欢迎留言一起讨论。
- 先说C++的参数传递
- C++的参数传递分为按值传递、指针传递、引用传递接下来用一个简单的例子来说明:
#include<iostream>
using namespace std;
void swap1(int num1,int num2)//交换传递的值
{
int temp;
temp = num1;
num1 = num2;
num2 = temp;
cout<<"swap函数中num1,num2的地址"<<&num1<<","<<&num2<<endl;
cout<<"swap函数中num1,num2的值"<<num1<<","<<num2<<endl;
}
void swap2(int* num1,int* num2)//交换指针所指向的内容
{
int temp;
temp = *num1;
*num1 = *num2;
*num2 = temp;
cout<<"swap函数中num1,num2的地址"<<num1<<","<<num2<<endl;
cout<<"swap函数中num1,num2的值"<<*num1<<","<<*num2<<endl;
}
void swap3(int* num1,int* num2)//交换指针
{
int* temp;
temp = num1;
num1 = num2;
num2 = temp;
cout<<"swap函数中num1,num2的地址"<<num1<<","<<num2<<endl;
cout<<"swap函数中num1,num2的值"<<*num1<<","<<*num2<<endl;
}
void swap4(int &num1,int &num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
cout<<"swap函数中num1,num2的地址"<<&num1<<","<<&num2<<endl;
cout<<"swap函数中num1,num2的值"<<num1<<","<<num2<<endl;
}
int main()
{
int num1,num2;
num1 = 777;
num2 = 222;
cout<<"swap函数之前main函数中num1,num2的值"<<num1<<","<<num2<<endl;
cout<<"swap函数之前num1,num2的地址"<<&num1<<","<<&num2<<endl;
// swap1(num1,num2);
// swap2(&num1,&num2);
// swap3(&num1,&num2);
swap4(num1,num2);
cout<<"swap函数之后main函数中num1,num2的值"<<num1<<","<<num2<<endl;
return 0;
}
- 在codeblocks下运行的,建议运行自行观察。
- 从结果可以看出
swap1(int,int)中,swap1只是将num1,num2的值复制到另一个内存区间进行操作,所以并不会影响main函数里的num1和num2
swap2(int*,int*)和swap3都为指针传递,所不同的是swap2中是直接对指针指向的值进行操作,而swap3仅仅是交换指针内存地址。有人举了个例子就是指针是线,变量的实际地址是气球。指针可以通过线去操作气球。当然也可以多根线(指针)指向同一个气球。
执行后就不画了,swap2里的num1和num2指针通过线直接操作气球也就是main函数里面的数,进行实际性的更改。所以num1和num2的值交换了。swap3函数我直接画图,执行前也是如上图swap2执行前一致
运行之后仅仅是交换了2个指针所指向的内存,并没有进行实际的操作,所以并不会改变main函数中的值。swap4属于引用传递&m_nickName = m,这个赋值表达式的m_nickName其实就是m的别名,对m_nickName的操作其实就是对m的操作。
swap4是直接对num1和num2进行操作。
感兴趣的同学可以将swap4中分配给num1和num2的地址(swap4函数中)直接删除,因为我不清楚如何删除。如果地址清空,报错,或者main函数无法输出,这就说明是直接进行操作的。
下次写为什么数组arr[]按swap1方法传递参数确改变了实际的值,以及JAVA的对象传递和String类的特殊情况
待续…….
本文探讨了JAVA和C++在参数传递上的差异,包括C++的按值传递、指针传递和引用传递,并通过示例分析了它们的影响。JAVA只采用按值传递,而C++还支持指针和引用,导致不同的行为。文章最后提到了数组和对象传递的特殊情况,以及后续会讨论的内容。

被折叠的 条评论
为什么被折叠?



