English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Указатель в языковом программировании Golang - это переменная, которая хранит адрес памяти другой переменной. Мы можем передавать указатель функции и возвращать указатель из функции Golang. В C/ C++ не рекомендуется возвращать адрес локальной переменной вне функции, так как он выходит за пределы области действия после возврата функции. Поэтому для выполнения возврата указателя из функции в C/ C++, переменную локальной переменной необходимо определить как статическую переменную.
Пример:Давайте начнем с примера на C++, в следующем программном примере, строка кода (int lv = n1 * n1;) будет генерировать предупреждение, потому что это местное кодирование функции. Чтобы избежать предупреждения, пожалуйста, установите его в статическую переменную.
// 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编译器将执行转义分析以从本地范围转义变量。
//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 ++这样的指针算法的任何支持。如果执行,则编译器将引发错误,认为是无效操作。