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


不知道我說/做什麼請回去 Day 4 看一下。
先貼源代碼:
void function(int **get_a){
    static int a;
    *get_ptr = &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_ptr = &a;
對 函數的 get_ptr 第一層的虛擬取值層級,賦值 a 的地址。
圖解:
https://ithelp.ithome.com.tw/upload/images/20181019/20111788nBb7W02UNv.png
實質上存在著空間的是主程序的 get_a ,函數的 get_a 只不過是指向過去了。
.
*get_a = 1;
退出函數,函數的 get_a 被銷毀,由於 a 是靜態的,空間被保留
對 主程序的 get_ptr 第一層的虛擬取值層級,賦值 1 。
即是 函數的 a 被賦值 1 。
圖解:
https://ithelp.ithome.com.tw/upload/images/20181019/20111788UoodMtjCA2.png
.
return 0;
主程序完結返回 0 ,成功改變了 函數的 a 。

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