函数实参与形参的区别

本文详细探讨了C语言和Java中函数实参与形参的区别。在C语言中,通过指针可以实现形参对实参值的直接修改,而在Java中,由于局部变量地址不可获取,只能通过数组等引用类型实现值的交换。总结了形参是实参的临时拷贝,仅在函数内部有效,且C语言可以通过指针操作实参,而Java则不行。
摘要由CSDN通过智能技术生成

一、C语言

程序清单1

#include <stdio.h>

void swap(int x, int y) {
	int tmp = x;
	x = y;
	y = tmp;	
}

int main() {
	int a = 3;
	int b = 5;
	printf("a = %d b = %d\n", a, b);
	swap(a, b);
	printf("a = %d b = %d\n", a, b);

	return 0;
}

输出结果:

1

分析:

在程序清单1中,a, b 为实参,x, y 为形参。

当 a 和 b 传入 swap( ) 函数的时候,x 和 y 确实能拿到 3 和 5 这两个值,但 x 和 y 本身与 a 和 b 拥有不同的地址,这就造成一个结果:在swap() 函数中,只交换了形参 x 和 y 的值,对于实参 a 和 b 来说,毫无影响。

1

程序清单2

#include <stdio.h>

void swap(int* pa, int* pb) {
	int tmp = *pa; // 解引用
	*pa = *pb;
	*pb = tmp;
}

int main() {
	int a = 3;
	int b = 5;
	printf("a = %d b = %d\n", a, b);
	swap(&a, &b);
	printf("a = %d b = %d\n", a, b);

	return 0;
}

输出结果:

2

分析:

在程序清单2 中,当我们实参传的是 a 和 b 的地址时,情况就完全不一样了,在 swap( ) 函数中,我们形参拿整型指针类型来接收地址,最后再通过解引用符号 " * " 来拿到地址对应的值,即可交换。

这里需要注意: pa 和 pb 存的值是 a 和 b 的地址,然而 pa 和 pb 本身是一个指针变量,既然是变量,它们也有属于自己的地址,前者后者不能搞混了。

2

二、Java

程序清单3

public class Test {
    public static void main(String[] args) {
        int a = 3;
        int b = 5;
        System.out.println("a = " + a + " b = " + b);
        swap(a,b);
        System.out.println("a = " + a + " b = " + b);

    }

    public static void swap(int a, int b){
        int temp = a;
        a = b;
        b = temp;
    }
}

输出结果:

out

在程序清单3中,现在我们就可以理解了 swap() 函数中的 a 和 b 和 main 函数中的 a 和 b 是不一样的。

程序清单4

public class Test {
    public static void main(String[] args) {
        int[] arr = {3, 5};
        System.out.println("a = " + arr[0] + " b = " + arr[1]);
        swap(arr);
        System.out.println("a = " + arr[0] + " b = " + arr[1]);
    }
    public static void swap(int[] arr) {
        int tmp = arr[0];
        arr[0] = arr[1];
        arr[1] = tmp;
    }
}

输出结果:

4

在 Java 中,我们拿不到局部变量的地址,或者说是拿不到栈区的地址。所以在程序清单4中,如果想要利用函数进行交换值,我们只能通过改变堆区的值来进行交换。

4

三、总结

① 形参是实参的一份临时拷贝,其只在当前函数中有效,出了当前函数,即被销毁,所以改变形参本质上不会影响实参的状态。

② 在 C 语言中,我们可以利用指针接收地址,从而拿到地址对应的值来直接进行改变实参。

③ 在 Java 中,形参依然是实参的一份临时拷贝。但情况又有不同,因为栈区存放的局部变量对应的地址,我们无法获得,所以我们只能通过数组改变堆区上的某个值,这样一来,也可以完成交换的逻辑。而数组本身就是一个引用类型,这样一来,就是和地址有关联了。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十七ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值