形参传递方式

一.java形参传递方式(传值)

背景介绍:1.java常量(声明常量必须用final关键字)一般位于常量池,为方法区的一部分,被所有线程所共享

                    2.java变量一般位于虚拟机栈,为每个线程私有

                    3.java对象一般位于堆,被所有线程所共享

附:

int a = 3; int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

1,String str1 = "hello";2,String str2 = new String("hello");

第一种方法:引用str1被存放在栈区,字符串常量"hello"被存放在常量池,引用str1指向了常量池中的"hello"(str1中的存放了常量池中"hello"的地址)。

第二种方法:引用str2被存放在栈区,同时在堆区开辟一块内存用于存放一个新的String类型对象。(同上,str2指向了堆区新开辟的String类型的对象)


示例介绍:

1.

 public static void main(String[] args) {
        int x=3;
        changeInt(x);
        System.out.println("After change, x = " + x);

    }
    public static void changeInt(int i) {
        i=2;
    }
       
分析:1.x指向内容为3的地址空间 (栈中)

         2 i复制内容为3的地址空间的内容

         3.i的值发生了改变,但此时x所属地址空间的内容并未发生改变

2.

 public static void main(String[] args) {
        StringBuffer x = new StringBuffer("Hello ");
        changeData(x);
        System.out.println("After change, x = " + x);

    }
    public static void changeData(StringBuffer strBuf) {
        strBuf = new StringBuffer("Hi ");
        //strBuf.append("world"); strBuf也指向了x指向的内存空间,而不是指向x的一个拷贝,所有此时x的值会发生变化
 }
分析:1.x指向内容为Hello的地址空间 (堆)

         2 strBuf指向内容为Hello的地址空间

         3.strBuf指向新开辟的地址空间,此时原来的指向失效,即x所属地址空间内容并未发生改变

综上所述:感觉java到处都被封装成指针,因为指针是指向某一内存地址的变量,在示例1中,在使用上int具有指针的特性,但由于无法实现地址传递/引用传递,导致最终x仍未变化,在示例2中,strBuf.append("world")类似于c++的引用传递;

二、c/c++形参传递方式(传值、传地址、传引用)

背景介绍:

一个由C/C++编译的程序占用的内存分为以下几个部分 
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 
5、程序代码区—存放函数体的二进制代码。
示例1:传值/传地址
传值方式:
    #include<stdio.h>
    void fun(int a, int b) // 此处a, b为形参
    {
        a++; 
        b++;
    }
    void main()
    { 
        int a=1, b=2; 
        fun(a, b); // 按传值方式调用函数fun,此处a,b为实参 
        printf("%d, %d\n", a, b); // 输出a=1, b=2
    }
传地址方式:
    #include<stdio.h>
    void fun(int *a, int *b)
   { 
       *a = 4; *b = 5;
    }
    void main()
    {
       int a=1, b=2; fun(&a, &b); // 按传地址方式调用函数fun 
       printf("%d, %d\n", a, b); // 输出a=4, b=5
    }
示例2:传引用
    #include <iostream>  
    using namespace std;  
    void swap(int&,int&);  
    int main()  
    {  
        int a = 3, b = 4;  
        cout << "a = " << a << ", b = "  
        << b << endl;  
        swap(a,b);  
        cout << "a = " << a << ", b = "  
        << b << endl;  
        system("pause");  
        return 0;  
    }  
    void swap(int &x,int &y)  
    {  
         int t = x;  
         x = y;  
         y = t;  
    }  


 
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值