函数的返回值是指针

函数返回值是指针的,不能返回函数内部的局部变量的地址,因为函数内部的局部变量在函数运行结束后生存期结束;

例如:

int* func()
{
    int value;
    return &value;//错误
}

int* func(int  value)
{
    return &value;//错误,形参也是函数内的局部变量
}

int* func(int  *value)
{
    return value;//这样是可以的,指针其实也是值传递,传指针也是将指针的值复制了一下
}

函数形参是函数内部内的局部变量,返回函数形参地址是不安全的,在以下示例中,虽然函数能返回形参地址,但返回后,形参已经释放了,且形参和实参的地址也不一样(当然不一样,因为实参是通过值传递给形参的,形参是一个临时变量),所以,这样做是不安全的。

int* func(int value)
{
    qDebug()<<"hanshunei xingcan address:"<< &value<<endl;
    return &value;
}
void main()
{
    int aa =2;
    qDebug()<<"shican address:"<<&aa<<endl;
    qDebug()<<"xingcan address:"<< func(aa)<<endl;
    qDebug()<<"xingcan value:"<< *(func(aa))<<endl;

}

当函数返回值为指针时,可以采用以下四种方式 :

1、函数形参是指针类型,返回形参相当于值传递

int* func(int *value)
{
    return value;
}

2、函数中局部变量声明为static类型

int* func()
{
    static int value = 1;
    return &value;
}

声明为static的话,value的生命周期为整个程序的生命周期,故可以返回其地址。

3、函数中指向常量的指针

char* func()
{
    char* value = "hello world";
    return value; 
}

4、函数中指针动态赋值(指向的内存位于堆,不free,该内存一直占用)

char* func()
{
    char* value = (char*)malloc(sizeof(char));
    return value; 
}

总结:上述四种方式,第一种是值传递(将指针的值进行了值传递);第二种是变量存在静态存储区(static)、第三种是变量存储在常量区、第四种是变量存储在堆,存储在这三种的位置的变量的生命周期都不会随函数调用结束而结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值