在講述內容之前,先講四點重要知識
1.當傳入引數時,函式形參會立即申請形參的記憶體空間,函式執行完畢後,形參的記憶體空間立即釋放掉。
1.指標是存放其他變數位址的變數。指標有自己的記憶體空間,記憶體空間存放的是其他變數的位址。
2.指標具體指向誰,要看指標記憶體空間存放的位址。存放誰的位址就指向誰。
3.函式引數傳參本質:實參傳給形參,都是拷貝.
指標做函式引數的本質剖析,講述四種情況
一、傳變數
#include
using namespace std;
#include
void change(int value)
void main()
為什麼沒有修改呢?
change(a)傳參時,value申請記憶體空間,這時有兩個記憶體空間,a的記憶體空間內容10拷貝形參value,這時value記憶體空間的內容為10,value = 20,修改了value記憶體空間的內容,a記憶體空間的內容仍然是10,所以未修改。
二、一級指標——初級
#include
using namespace std;
#include
void change(int *p)
void main()
為什麼修改了?
change(&a)傳參時,指標變數p申請記憶體空間,這時有兩個記憶體空間,a的位址拷貝給形參p,p的記憶體空間存放的是a的位址,即p指向a,*p = 20,即修改p指向的記憶體空間——a的值。所以修改了。
三、一級指標——高階
void getmemory(char *p)
void main()
產生中斷,也就是說上面的程式存在問題,有什麼問題呢?
getmemory(str)傳參時,指標變數p申請記憶體空間,這時有兩個記憶體空間,str的記憶體空間的內容拷貝給p,即p的記憶體空間的內容是null,p指向空。 p = (char *)malloc(sizeof(100)),在堆上面申請乙個100的記憶體空間,返回這個記憶體空間的首位址賦值給p,此時p的記憶體空間的內容為這個首位址,p指向這塊記憶體空間,而與str沒有任何關係,str仍然是null.因此在strcpy(str, "hello world")時,出現中斷。
四、二級指標
void getmemory(char* *p)
void main()
這個為什麼拷貝成功了呢?
在講述之前,先注意p是二級指標,*p是一級指標,getmemory(&str)傳參時,指標變數p申請記憶體空間,這時有兩個記憶體空間,str的位址拷貝給p的記憶體空間,即p的記憶體空間的內容是str的位址,這時p指向str的記憶體空間--->p = &str,*p = str,*p 和 str兩個名字,其實是相等的,指向的是同一塊記憶體空間(上述程式在此時是null)。* p = (char *)malloc(sizeof(100)),在堆上面申請乙個100的記憶體空間,返回這個記憶體空間的首位址賦值給*p;*p是一級指標,*p(str)記憶體空間就有值了,不再是null,記憶體空間的內容是這個位址,也就是*p和str指向這塊記憶體空間,這個記憶體空間可以存放100個變數的位址,所以指標是存放其他變數位址的變數還是對的。接下來的strcpy(str, "hello world")也就成功了,free(str)釋放掉str(*p)所指向的記憶體空間.請注意,在這個過程中,p的記憶體空間的位址始終是str的位址,沒有改變。
一級指標 二級指標做函式引數的深入剖析
在講述內容之前,先講四點重要知識 1.當傳入引數時,函式形參會立即申請形參的記憶體空間,函式執行完畢後,形參的記憶體空間立即釋放掉。1.指標是存放其他變數位址的變數。指標有自己的記憶體空間,記憶體空間存放的是其他變數的位址。2.指標具體指向誰,要看指標記憶體空間存放的位址。存放誰的位址就指向誰。3....
一級指標二級指標
例如 int p null int代表指標p指向的資料型別是int型,代表這是乙個指標變數,1 指標變數儲存的內容是指向的變數的位址 2 在使用sizeof判斷指標的位元組數時,在32位機器上為4個位元組,在64位機器上為了相容,仍然是四個位元組大小 3 小知識點,不同型別的指標除了指向的變數資料型...
一級指標與二級指標
如下圖所示,整型指標xptr指向變數x的位址。原始碼 include int main 實現方法一如下圖所示,先為二級整型指標ptr分配空間,然後賦值。原始碼 include include int main printf n return 0 執行結果 實現方法二 如下圖所示,先為二級整型指標pt...