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

来源:互联网 发布:python入门经典 网盘 编辑:程序博客网 时间:2024/05/16 00:34
  • 我是从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类的特殊情况
待续…….

0 0
原创粉丝点击