如下圖所示,整型指標xptr指向變數x的位址。
原始碼:
#include int main()
實現方法一如下圖所示,先為二級整型指標ptr分配空間,然後賦值。
原始碼:#include #include int main()
printf("\n");
}
return 0;
}執行結果:
實現方法二
如下圖所示,先為二級整型指標ptr分配空間,然後賦值。
與實現方法一的不同之處,在於使用陣列形式就行相關操作。
原始碼:#include #include int main()
printf("\n");
}
return 0;
}*p和**p的區別
int *p :一級指標,表示p所指向的位址裡面存放的是乙個int型別的值
int **p :二級指標,表示p所指向的位址裡面存放的是乙個指向int型別的指標(即p指向的位址裡面存放的是乙個指向int的一級指標)
例如:int i=10; //定義了乙個整型變數
int *p=&i; //定義了乙個指標指向這個變數
int **p1=&p; //定義了乙個二級指標指向p指標
那麼取出10的值方式為:
printf(「i=[%d]\n」,*p);
printf(「i=[%d]\n」,**p1);
void test(char *p)
int main()
輸出結果: 注意:(test函式的pde值已改變,main函式的a的值未改變)
main1][a]:0xbfeaaef6.
[main2][a]:abcde.
[test1][p]:0xbfeaaef6.
[test2][p]:abcde.
[test3]malloc之後…
[test4][p]:0x8a52008.
[test5][p]:abcde.
[main3][a]:0xbfeaaef6.
[main4][a]:abcde.
void test(char **p)
int main()
輸出結果: 注意:(test函式的pde值已改變,main函式的a的值也已經改變)
[main1][a]:0xbfaca776.
[main2][a]:abcde.
[test1][p]:0xbfaca770.
[test2][*p]:0xbfaca776.
[test3]malloc之後…
[test4][p]:0xbfaca770.
[test5][*p]:0x9132008.
[test6][*p]:abcde.
[main3][a]:0x9132008.
[main4][a]:abcde.
實參:實實在在的引數,我們自己定義的,比如以上程式中指標a和陣列b都是實參,都是自己定義的,基本程式中花括號內定義的所有引數都是實參
形參:我們定義乙個函式時,括號內的引數,比如以上程式中的char *p和char **p中的p就是形參,主要是為了讓實參的資料可以傳遞到函式內,供函式操作
引數的傳遞分為兩種,一種是值傳遞,另一種是引用;我們這裡說的只主要是值傳遞,暫時不說引用傳遞;值傳遞又分為兩種:一種是實際的值傳遞,int型別的引數傳遞屬於實際值傳遞;另一種就是位址值傳遞,實參比實際位址傳遞給形參,比如指標就是位址值傳遞。
這裡是引數傳遞的重點,當實參把實際值或者位址值傳遞給形參時,實際上不是直接使用實參,而是在棧去開闢記憶體空間copy乙個副本,int a的副本是_a(_a=a),,char *p的副本是_p(_p=p), 所以函式內的操作都是對副本進行操作,改變形參的值不會影響實參的值,函式執行完就釋放副本開闢的空間。
指標的概念,指標也是乙個引數,和int及char類似,int 引數存放整數,char引數存放字元,指標存放的是乙個位址而已;指標就是儲存一片記憶體的起始位址,知道這個指標就可以對這個指標指向的記憶體進行操作;指向指標的指標即二級指標儲存的是一級指標的位址,比如:
p是一級指標,儲存的是a的位址;q是指向指標的指標(二級指標),儲存的是一級指標(p)的位址;q的內容就是0xbfaca770,q的值即q指向的內容0xbfaca776,即q仍然是乙個位址,也就是指標p的內容,即q=p,(好好理清楚),對q操作就是對p指向的記憶體操作;為什麼要使用二級指標呢?下面會有講述:
之前的指向情況:(方塊上面是當前變數的位址,方塊內是當前變數的值)
之後的指向情況: (方塊上面是當前變數的位址,方塊內是當前變數的值)
從之前的情況可以看出,函式進行引數傳遞時,實參把位址傳給了形參p(p即是a的副本(_a),p=_a是為了表達更直觀,並不會產生變數名_a),兩個指標同時指向一片記憶體;使用malloc之後,空出一遍新記憶體並把位址賦給p,即p的指向改變,指向了新位址;所以test內對p的內容進行改變不會改變a的值。
之前的指向情況:
之後的情況:
好了,我們來看一下,test函式的形參使用的是二級指標,我們把a的位址傳給了p,即p指向了a;指標a指向的是陣列b,即儲存的是b的首位址,見第二個程式第一張圖;二級指標p指向一級指標a,所以p的值就是a的首位址,所以改變p的內容就是改變a的內容,即改變a的指向;當malloc一段記憶體並把首位址儲存在p的內容中,就是把malloc記憶體的首位址直接替換指標a原來的內容,所以a指標的指向發生了改變,見第二個程式第二張圖;所以改變p就是改變a的值(要理解*p和a就是同乙個變數);
一級指標二級指標
例如 int p null int代表指標p指向的資料型別是int型,代表這是乙個指標變數,1 指標變數儲存的內容是指向的變數的位址 2 在使用sizeof判斷指標的位元組數時,在32位機器上為4個位元組,在64位機器上為了相容,仍然是四個位元組大小 3 小知識點,不同型別的指標除了指向的變數資料型...
二級指標與一級指標重溫
今天在和同學討論為了介面的一致性,怎麼處理野指標的問題,我就想在以前寫過的鍊錶中練習一下。選擇了在雙向迴圈鍊錶中erase節點時,傳入二級指標並置空他。沒想到遇到了問題,曾經以為對二級指標,一級指標的問題已經了解了,因為在單鏈表中,頭插,尾插中已經訓練過,在鍊錶為空時有3種處理辦法。第一種,是需要傳...
一級指標和二級指標
通常用作函式的輸入引數,因為一級指標作為函式引數,在呼叫的時候,實參和形參是不同的記憶體空間,只是,這個記憶體空間存放的指標指向的是同一塊位址,所以形參在函式執行中可以訪問實參指向的記憶體空間,但是形參的指向的改變並不能影響實參。總結一句話 一級指標做函式引數,在函式內做形參做重新指向並 不會影響實...