1樓:匿名使用者
可以遞迴個沒完
在main函式中,取指標的深度是有限的(總不能寫無數個&吧,其實如果超過了一定個數,編譯器首先會受不了,這就不細講了)。
既然,取指標操作的層數是有限的,那麼這些指標作為函式中的區域性變數,實際上是在資料段中的固定區域,是靜態分配的,但一開始沒有初始化。
現在考慮用遞迴函式取指標的情況,函式呼叫時會保護現場,他會把區域性變數暫時的值壓到堆疊(跟之前說的資料段、儲存函式的**段一樣是編譯後的軟體的基本組成部分)裡,所以其實每一步的取指標的操作都會儲存下來。但實際上取到的地址是區域性變數在資料段中的地址。
雖然被壓到棧裡以後,儲存這些資料的記憶體變了,但指標不會變。如果例子中的main遞迴的話,第一次和第二次取到的&a是一樣的,它會儲存到p的空間裡。當函式呼叫完成後,回到原來的函式中,之前暫存的資料會從棧裡出來,重新回到a、p表示的空間。
這時候p依然指向a,指標的關係還是儲存了下來。
如果要無限遞迴是不可能的,因為棧的大小是有限的,如果超出了上限,作業系統會報錯(不報錯那就是溢位漏洞了),linux的話會報「段錯誤」。
有點囉嗦,可還是省略很多內容,我也不知道該挑點什麼講。如果樓主還不明白,一定是我水平不到位。
可以參考這本書的前幾章(只是前幾章,不用真的學彙編):一步一步學習linux組合語言程式設計(assembly language step-by-step - programming with linux)
再結合編譯原理的一點東西就很清楚了
當初我是稀裡糊塗學的c,都沒想到有這種問題,樓主好犀利啊。贊!
2樓:冰是沉默的水
當然,如果你能編譯通過說明你的思維是正確的
關於C語言指標問題,求大神,C語言指標的問題,求大神!!
第一個函式的兩個指標是區域性變數,函式完了就銷燬了,換不換都一樣,第二個是直接操作指標指向的地方 記憶體單元 也就是直接操作變數。不恰當的比方,好比停車,有個圖紙記錄了每個車位停的什麼車,第一個就相當於另外拿了個圖紙畫了一下想要的位置,原來的圖沒變,函式結束後來的圖被扔了,原來的圖保留著,實際的車並...
關於C語言指標的一道入門程式設計題,C語言指標簡單的程式設計題
include include void input int array printf n輸出10個數 理前 n for int j 0 j 10 j void getresult int array p temp q q p 1 p 1 temp find min p array q array ...
c語言指標問題,C語言指標問題
記憶體對齊的緣故。p buf 作為一個指標,它的值是記憶體的某個位元組的地址。如果想要把 p buf 強制轉換版 成一個 unsigned int 型別的指權針,需要滿足一個必要條件,就是 p buf 的值必須能夠被4整除。之所以是4,是因為 unsigned int 是要佔4個位元組的 c語言結構...