传值调用
值掉用指的是将实参的值拷贝一份至函数中的形参,形参和实参的值是一样的,但是在内存中分别在不同的内存地址中,在调用函数执行的过程中会建立一个和实参类型、值一样的变量,执行完后拷贝返回值到返回结果中,其他在函数中创建的栈中的变量都会被销毁。
传址调用
传址调用指的是将变量的地址传入调用函数中,在调用函数中对改变量的地址进行解引用操作的时候,会改变该变量的值,这种调用方式让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
值得注意的是函数的形参是指针类型的话,并不代表是传址调用
真正的传址的掉用是在外部函数中传入变量的指针,这个变量可以是包含指针类型的任何类型
如
type a;
function(&a);
在函数内部需要进行解应用
retType function(type * a)
{
...
*a = ...;
...
}
这样才算是解应用
典型类型有动态分配内存,若要传入的变量指向开辟的堆区中则需要
void Malloc(type** a)
{
*a =(type*)malloc(size_type);
}
或者直接使用返回值返回动态分配开辟的内存地址
type* Malloc()
{
type *a =(type*)malloc(size_type);
return a;
}
值得注意的是动态开辟的内存可以使用这种方式返回指针,而在函数中的局部变量则不能这样直接返回指针
若
type* function()
{
type a =..
//handle
return &a;
}
这种返回局部变量的指针的方式就是错误的,不可以返回栈区中的地址,因为局部变量出了函数作用域后会被销毁,返回的指针变量就是一块未开辟的内存指针,也就是野指针