C指標以及為什麼不能返回區域性指標變數,卻可以返回區域性變數
如:int* 是一個指標變數型別
指標變數和普通變數沒有什麼區別,指標32位四位元組,裡面儲存的是一個記憶體空間的地址,
就像一個整形變數int a, a就可以代表一個整數,一個指標變數int* p,p就可以代表一個
地址資料,而*地址,代表去這個地址指向的記憶體空間取出裡面的內容,因此如果是要取出
這個指標所指向的記憶體裡面的內容就是*p,而如果是需要獲得那個記憶體的地址,或者讓另外
一個指標指向這個空間時,就可以使用int* pb;pb=p;
&變數名這是獲取儲存這個變數的記憶體空間地址
應該說c語言是門十分靈活的語言,型別幾乎可以說無所謂了,有的只有記憶體和讀取的方式
,什麼幾級指標,都沒有意義,就算是一整形,只要強轉,也可以當作地址資料來用,只是
可能會段錯誤,因為沒有做地址對映
*p代表的是地址裡面的儲存的值
p代表的是一個指標變數
int* p[10] *和[]優先順序相同,平級右結合 p為一個數組,包含了10個指標變數
int (* p)[10] p為指向一個數組的指標
為什麼不能返回區域性指標變數,卻可以返回區域性變數
函式的區域性變數用作返回值時,會生成一個區域性變數的拷貝用作返回值,之後區域性變數會被系統回收,函式不能返回區域性變數的地址,因為如果返回區域性變數的地址,系統回收後,指標指向的內容就無意義了,但是對於靜態變數也可以返回其指標。
#include "stdio.h"
int *a()
{
int b;
int *p;
b=23;
printf("b=%d \n",b);
return &b;
}
void main()
{
int *r;
r=a();
//printf("");
printf("r=%d",*r);
getch();
}
如以上程式碼,函式返回的是區域性變數的指標,此時在主函式裡打印出的r應該不等於23,可是實際結果卻是23,當在列印結果之前再添
加一個printf語句時列印的結果才不會是23,在CSDN上討論:http://topic.csdn.net/u/20120206/22/487c9e4f-bf36-4ed1-9e6a-a6e7
cb7404e5.html?seed=1431559918&r=77464424#r_77464424,這裡系統可能沒及時回收區域性變數才導致打印出的還是區域性變數的值
具體的應該如下:
1. 如果返回一個基本型別的變數,比如:
int a;
a = 5;
return a;
那麼就會a的一個拷貝,即5返回,然後a就被銷燬了。儘管a被銷燬了,但它的副本5還是成功地返回了,所以這樣做沒有問題。
2. 但是對於指標,像1那麼做就會有問題,比如在某個函式內部:
int a[] = {1, 2};
return a;
那麼也會返回指標a的一個拷貝,我們假定a的地址值為0x002345FC,那麼這個0x2345FC是能夠成功返回的。當return執行完成後,a就
要被銷燬,也就是0x002345FC所指向的記憶體被回收了。如果這時候在函式外面,去地址0x002345FC取值,那得到的結果肯定是不對的
。這就是為什麼不能返回區域性指標的原因。返回區域性變數的引用的道理和這個類似。
3. 對於靜態變數:
static int b=10;
return &b;
由於靜態變數是存放在靜態儲存區的,所以不會被系統回收,所以返回值還是有效的。