summary

kwdecsdn發表於2020-09-23

@[toc] 
# 一、關於二維陣列的學習。
## 1、測試過程
關於二維陣列自己其實學的差不多了,但發現二維陣列作為形參時自己理解的還不是很到位,特此寫下來測試demo分析。

編譯過程發現:

執行結果:

總體來分析:總體結果符合預期,就是用二重指標這個地方為什麼會段錯誤?

## 2、彙編程式碼分析

分析如下:二維陣列名本身還是一個指標,只不過是一個特殊型別的指標(陣列指標),代表這個陣列的首地址,我們定義引數為int array[3][5]或者int (*array)[5]時,會告訴編譯器:這是一個陣列指標,因此c標準規定取元素時必須**array而且跨度是一維陣列的長度,但編譯完以後的彙編程式碼可以看到只是取了一次地址(*ptr),可以看到*array = array.

對於一維陣列,只有當陣列名在表示式中使用時,編譯器才會產生一個指標常量,形參會把指標常量賦給一個指標(頂層const)。而只有以下兩種情況,才不被當做指標常量(來自c和指標P141),.

①、sizeof(陣列名),返回的是陣列長度,而不是指向陣列的指標長度,編譯時一般都會確定。

②、&陣列名,產生一個指向陣列的指標,而不是指向某一個指標常量的指標。

# 二、關於函式棧的學習。

驗證csdn上的評論:形參也佔用棧記憶體。

其實下面的圖中右邊的圖是不正確的(2和4在上面),早期的CISC結構是棧密集型,引數的傳遞是通過呼叫者儲存,具體可以參考彙編程式碼。其實後來的CISC也可以用暫存器傳遞引數(6個,參考CSAPP)。

相關文章