传值调用和传址调用

本文介绍了函数调用的两种主要方式——传值调用和传址调用。传值调用复制实参的值到形参,而传址调用传递变量地址,允许函数直接修改外部变量。动态内存分配时,需通过指针返回,但不能返回局部变量的地址,以防形成野指针。
摘要由CSDN通过智能技术生成

传值调用

        值掉用指的是将实参的值拷贝一份至函数中的形参,形参和实参的值是一样的,但是在内存中分别在不同的内存地址中,在调用函数执行的过程中会建立一个和实参类型、值一样的变量,执行完后拷贝返回值到返回结果中,其他在函数中创建的栈中的变量都会被销毁。

传址调用

传址调用指的是将变量的地址传入调用函数中,在调用函数中对改变量的地址进行解引用操作的时候,会改变该变量的值,这种调用方式让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

值得注意的是函数的形参是指针类型的话,并不代表是传址调用
真正的传址的掉用是在外部函数中传入变量的指针,这个变量可以是包含指针类型的任何类型

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;
}


这种返回局部变量的指针的方式就是错误的,不可以返回栈区中的地址,因为局部变量出了函数作用域后会被销毁,返回的指针变量就是一块未开辟的内存指针,也就是野指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值