浅谈JAVA和C++两者的参数传递

本文探讨了JAVA和C++在参数传递上的差异,包括C++的按值传递、指针传递和引用传递,并通过示例分析了它们的影响。JAVA只采用按值传递,而C++还支持指针和引用,导致不同的行为。文章最后提到了数组和对象传递的特殊情况,以及后续会讨论的内容。
  • 我是从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类的特殊情况
待续…….

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值