C语言与java中函数传参比较
首先先说结论:C语言中参数传递有值传递,地址传递,引用传递。但java中的参数传递只有值传递
1.C语言中的参数传递
1>值传递
- 值传递非常好理解,其实就是对函数所传入的实参进行了一次拷贝,虽然传入函数的值与原来的实参是相等的,但是在内存中却占据着不同的地址,所以在函数中对其进行操作也只是在新的内存地址上进行操作,并不会影响到原来的值。
- 为了更好的理解,我们举个例子
#include<stdio.h>
void test(int a)
{
printf("a的值:%d ,",a);
printf("a的地址: %d\n",&a);
}
int main()
{
int a = 10;
printf("a的值:%d ,",a);
printf("a的地址: %d\n",&a);
test(a);
return 0;
}
执行这段代码,我们发现运行结果是这样的:
清晰的看到通过值传递后函数中的a与实参a在内存中地址不同,所以在函数中对a进行修改是影响不到实际的a的。
2>地址传递
- 根据地址传递这个名字我们可以知道在传递参数时是以地址的方式传递的。并且传递的地址也是内存中的一块空间,下面我们来看一下这段代码
#include<stdio.h>
int main()
{
int a = 10;
int* b = &a;
printf("a的值: %d\n",a);
printf("a的地址: %d\n",&a);
printf("b的值: %d\n",b);
printf("b的地址: %d\n",&b);
return 0;
}
跑出来的结果
- 我们在声明指针变量是,一般是 int *b 这种形式
但是我这里用 int* b是为了说明:指针其实是一种特殊的数据类型,所以:
int* b其实就是声明b是一个指针变量
上面的代码中把a的地址赋值给b(指针变量),而这个指针变量有存放在内存中的某个地方
#include<stdio.h>
void test(int* b)
{
int c = 20;
*b = c;
}
int main()
{
int a = 10;
int* b = &a;
printf("处理前:a的值: %d\n",a);
printf("处理前:a的地址: %d\n",&a);
printf("处理前:b的值: %d\n",b);
printf("处理前:b的地址: %d\n",&b);
test(b);