Golang編程語言中的指針是一個變量,用于存儲另一個變量的內存地址。我們可以將指針傳遞給函數,也可以從Golang中的函數返回指針。在C/ c++中,不建議在函數之外返回局部變量的地址,因為它在函數返回后超出了作用域。因此,要在C/ c++中執(zhí)行從函數返回指針,必須將局部變量定義為靜態(tài)變量。
示例:讓我先來看個C++示例,在下面的程序中,代碼行(int lv = n1 * n1;)將發(fā)出警告,因為它是該函數的本地代碼。 為避免警告,請將其設置為靜態(tài)變量。
// 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
這種情況下的主要原因是編譯器始終為函數調用生成堆棧。一旦函數退出,函數堆棧也會被刪除,這會導致函數的局部變量超出范圍。將其設置為靜態(tài)將解決該問題。由于靜態(tài)變量具有保留其值的屬性,即使它們超出其范圍也是如此。
但是Go編譯器非常智能!。它不會將堆棧上的內存分配給該函數的局部變量。它將在堆上分配此變量。在下面的程序中,變量lv將在堆上分配內存,因為Go編譯器將執(zhí)行轉義分析以從本地范圍轉義變量。
//Go 函數返回指針 package main import "fmt" func main() { //調用函數 n := rpf() //顯示值 fmt.Println("n的值: ", *n) } //定義具有整數的函數 //指針作為返回類型 func rpf() *int { //局部變量 //函數內部使用簡短運算符聲明 lv := 100 // 返回lv的地址 return &lv }
輸出:
n的值: 100
注意: Golang不提供對像C / C ++這樣的指針算法的任何支持。如果執(zhí)行,則編譯器將引發(fā)錯誤,認為是無效操作。