目錄
1. 不可返回的局部變量
1.1 函數不能返回指向棧內存的指針
【示例】:
int * get()
{
int a = 10; // 屬於局部變量,存儲在棧中,在函數結束后,內存被釋放,函數返回的指向a的內容也不確定
return &a;
}
// 或
char *GetMemory(void)
{
char p[] = "hello world!"; // p是一個數組名,屬於局部變量
return p;
}
2 可返回的局部變量
2.1 返回局部變量本身
【示例】:
int sum(int a, int b)
{
int s = a + b; //
return s;
}
2.2 常量
【常量】
char *GetMemory(void)
{
char *p = "hello world!"; // 字符串常量,,不能p[1]=‘a’. 常量不能修改。hello world是const char *
return p; //函數返回p存儲的地址
}
2.3 靜態局部變量
【示例】:
const char *GetMemory(void)
{
static char p[] = "hello world!";
return p;// 改為靜態變量,存儲在靜態存儲區,在程序結束后釋放
}
或者
int* returnValue()
{
static int value[3]={1,2,3};
return value;
}
2.4 堆內存中的局部變量
【示例】:
int *sum(int a, int b)
{
int *s=new int();
*s=a+b;
return s;
}
2.5 返回值為值類型的函數
【示例】:
int func()
{
return 1;
}
int i = func();
//有一個臨時對象來保存func()函數的返回值1,之后將臨時對象的值賦給i。
//編譯器將所有的臨時對象自動成為const。所以,對於返回值為值類型的函數,其返回值func()為右值。
2.6 返回值為引用類型的函數
當函數的返回值是引用類型時,其返回值即為返回的變量,不需要臨時對象保存其返回值。所以,對於返回值為引用類型的函數,其返回值為左值。
【示例】:
int &sum(int a, int b)
{
int s = a+b;
return s;
}