▌來談一下 不使用回傳地址方式 的複雜例子。
不知道我說/做什麼請回去 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;
}
概念上有點複雜,很難直觀感受。
可以的話先理解一下,再下去看。
void function(int **get_a){
static int a;
*get_ptr = &a;
}
int main(){
int *get_a;
function(&get_a);
*get_a = 1;
return 0;
}
可以的話先理解一下,再下去看。
▌下面用圖解分析:
這個是未開始運行的樣子,
這個是未開始運行的樣子,
▌逐段逐段運行感受一下:
int *get_a;
宣告 get_a ,類型為 int* 。
.
function(&get_a);
傳入 主程序 的 get_a 的地址 作為 函數 function() 的參數。
由 函數的 get_a 接收,類型為 int**。
圖解:
紅色為改變了的部分。
.
static int a;
進入函數function(),宣告 a ,類型為 static int。
.
*get_ptr = &a;
對 函數的 get_ptr 第一層的虛擬取值層級,賦值 a 的地址。
圖解:
實質上存在著空間的是主程序的 get_a ,函數的 get_a 只不過是指向過去了。
.
*get_a = 1;
退出函數,函數的 get_a 被銷毀,由於 a 是靜態的,空間被保留。
對 主程序的 get_ptr 第一層的虛擬取值層級,賦值 1 。
即是 函數的 a 被賦值 1 。
圖解:
.
return 0;
主程序完結返回 0 ,成功改變了 函數的 a 。
篇幅太長,有點混亂,去下一篇整合和說一下有關的概念。
int *get_a;
.
function(&get_a);
由 函數的 get_a 接收,類型為 int**。
紅色為改變了的部分。
.
static int a;
.
*get_ptr = &a;
實質上存在著空間的是主程序的 get_a ,函數的 get_a 只不過是指向過去了。
.
*get_a = 1;
對 主程序的 get_ptr 第一層的虛擬取值層級,賦值 1 。
即是 函數的 a 被賦值 1 。
.
return 0;
0 Comments
發佈留言