阅读 249

Go 语言函数返回指针

Golang编程语言中的指针是一个变量,用于存储另一个变量的内存地址。我们可以将指针传递给函数,也可以从Golang中的函数返回指针。在C/ c++中,不建议在函数之外返回局部变量的地址,因为它在函数返回后超出了作用域。因此,要在C/ c++中执行从函数返回指针,必须将局部变量定义为静态变量。

示例:让我先来看个C++示例,在下面的程序中,代码行(int lv = n1 * n1;)将发出警告,因为它是该函数的本地代码。 为避免警告,请将其设置为静态变量。

C++示例代码

// C ++程序返回//来自函数的指针#include <iostream> using namespace std; 
  //接受具有指针作为返回类型int* rpf(int); 
  int main() { 
  
    int n = 745; 
  
    //显示n的值    cout << n << endl; 
  
    //调用函数    cout << *rpf(n) << endl; 
} 
  //定义函数 int* rpf(int n1) { 
  
        //取局部变量        //在函数内部    int lv = n1 * n1; 
  
        
    // static int lv = n1 * n1;   
    //C++ 中 这将给我们抛出警告    //返回地址    return &lv; 
}

警告事项

prog.cpp: In function ‘int* rpf(int)’:
prog.cpp:24:9: warning: address of local variable ‘lv’ returned [-Wreturn-local-addr]
int lv = n1 * n1;

输出:

745

这种情况下的主要原因是编译器始终为函数调用生成堆栈。一旦函数退出,函数堆栈也会被删除,这会导致函数的局部变量超出范围。将其设置为静态将解决该问题。由于静态变量具有保留其值的属性,即使它们超出其范围也是如此。

但是Go编译器非常智能!。它不会将堆栈上的内存分配给该函数的局部变量。它将在堆上分配此变量。在下面的程序中,变量lv将在堆上分配内存,因为Go编译器将执行转义分析以从本地范围转义变量。

Golang示例代码

//Go 函数返回指针package mainimport "fmt"func main() {

    //调用函数    n := rpf()

    //显示值    fmt.Println("n的值: ", *n)

}//定义具有整数的函数//指针作为返回类型func rpf() *int {

    //局部变量    //函数内部使用简短运算符声明    lv := 100    // 返回lv的地址    return &lv
}

输出:

n的值:  100

注意: Golang不提供对像C / C ++这样的指针算法的任何支持。如果执行,则编译器将引发错误,认为是无效操作。

相关知识: Go中的指针和将指针传递给函数


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐