iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
2
自我挑戰組

30 Days 如何把 C 語言偽裝成高階語言 OWO /系列 第 5

Days 5: 重溫指標:不使用回傳地址方式的函數

▌來談一下 不使用回傳地址方式 的複雜例子。


不知道我說/做什麼請回去 Day 4 看一下。

先貼源代碼:

void function(int **get_a){
    static int a;
    *get_a = &a;
}
int main(){
    int *get_a;
    function(&get_a);
    *get_a = 1;
    return 0;
}

概念上有點複雜,很難直觀感受。
可以的話先理解一下,再下去看。

▌下面用圖解分析:

https://ithelp.ithome.com.tw/upload/images/20181019/20111788mrS8kR9wxB.png
這個是未開始運行的樣子,

▌逐段逐段運行感受一下:

int *get_a;

宣告 get_a ,類型為 int* 。
.

function(&get_a);

傳入 主程序 的 get_a 的地址 作為 函數 function() 的參數
函數的 get_a 接收,類型為 int**。

圖解:
https://ithelp.ithome.com.tw/upload/images/20181019/20111788uzTvrwgF62.png
紅色為改變了的部分。
.

static int a;

進入函數function(),宣告 a ,類型為 static int。
.

*get_a = &a;

函數的 get_a 第一層的虛擬取值層級,賦值 a 的地址。

圖解:
https://ithelp.ithome.com.tw/upload/images/20181019/20111788nBb7W02UNv.png
實質上存在著空間的是主程序的 get_a函數的 get_a 只不過是指向過去了。
.

*get_a = 1;

退出函數,函數的 get_a 被銷毀,由於 a 是靜態的,空間被保留
主程序的 get_a 第一層的虛擬取值層級,賦值 1 。
即是 函數的 a 被賦值 1 。

圖解:
https://ithelp.ithome.com.tw/upload/images/20181019/20111788UoodMtjCA2.png
.

return 0;

主程序完結返回 0 ,成功改變了 函數的 a 。


篇幅太長,有點混亂,去下一篇整合和說一下有關的概念。


上一篇
Days 4: 重溫指標:靜態變數的地址、函數回傳地址
下一篇
Days 6: 重溫指標:不使用回傳地址方式的函數(續.)
系列文
30 Days 如何把 C 語言偽裝成高階語言 OWO /31

尚未有邦友留言

立即登入留言