系統程式設計學習筆記
今天主要看了作用域和傳值傳引用以及遞迴,都是十分典型的問題,而且我發現卡耐基上面講的很不錯,所以做一下筆記。
首先是作用域,這裡有一個典型的程式:
#include <stdio.h> int first; int second; void callee ( int first ) { int second; second = 1; first = 2; printf("callee: first = %d second = %d\n", first, second); } int main (int argc, char *argv[]) { first = 1; second = 2; callee(first); printf("caller: first = %d second = %d\n", first, second); return 0; }
從這裡面我明白區域性作用域的優先順序高於全域性作用域。還有就是程式在呼叫函式之前會對引數做一個複製(如果是傳值的話),那麼這個區域性物件怎麼才能觀察到呢?還沒解決。
另外就是傳值和傳引用。
#include <stdio.h> int first; int second; void callee ( int * first ) { int second; second = 1; *first = 2; printf("callee: first = %d second = %d\n", *first, second); } int main (int argc, char *argv[]) { first = 1; second = 2; callee(&first); printf("caller: first = %d second = %d\n", first, second); return 0; } |
標準的傳值
void fun(int a);
標準的傳引用
void fun(int& a);
#include <stdio.h> #include <stdlib.h> void callee (int n) { if (n == 0) return; printf("%d (0x%08x)\n", n, &n); callee (n - 1); printf("%d (0x%08x)\n", n, &n); } int main (int argc, char * argv[]) { int n; if (argc < 2) { printf("USAGE: %s <integer>\n", argv[0]); return 1; } n = atoi(argv[1]); callee(n); return 0; } |
What happens is that the compiler inserts additional code for every function call and every function return. This code allocates any local variables that the callee needs for that invocation. Multiple invocations of the callee activate this allocation code over and over again. This is called dynamic allocation, because the local variables are allocated at runtime, as needed.
Global variables can be allocated statically. This means that the compiler can fix specific addresses for global variables before the program executes. But because functions can be called recursively, and each recursive invocation needs its own instantiation of local variables, compilers must allocate local variables dynamically. Such dynamic behavior makes the program run more slowly, so it is not desirable. But it is necessary for local variables.
意思就是每次函式呼叫之前編譯器會做一些事情,做什麼事情呢?就是插入一些額外的程式碼。這些程式碼會為函式分配區域性變數。由於程式不知道有多少區域性變數,所以全域性變數的地址和區域性變數的地址相差的很大。
相關文章
- Windows 95 系統程式設計大奧秘學習筆記 (轉)Windows程式設計筆記
- Unix高階程式設計學習筆記--系統呼叫簡介程式設計筆記
- 網路程式設計學習筆記程式設計筆記
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- Golang 學習筆記——tun/tap 程式設計Golang筆記程式設計
- 結構化程式設計--學習筆記程式設計筆記
- Javascript高階程式設計 學習筆記JavaScript程式設計筆記
- ROS串列埠程式設計學習筆記ROS串列埠程式設計筆記
- spark學習筆記--進階程式設計Spark筆記程式設計
- Linux Shell 程式設計學習筆記Linux程式設計筆記
- 《Windows 程式設計》學習筆記(五) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(四) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(三) (轉)Windows程式設計筆記
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記
- 統計學習方法筆記筆記
- 設計模式學習筆記設計模式筆記
- 學習筆記-設計模式筆記設計模式
- 好程式設計師web前端培訓學習筆記Vue學習筆記一程式設計師Web前端筆記Vue
- 好程式設計師學習筆記:函式程式設計師筆記函式
- Vue學習筆記(九):元件化程式設計Vue筆記元件化程式設計
- nginx學習筆記(6):程式模型的設計Nginx筆記模型
- Java學習筆記--網路程式設計SocketJava筆記程式設計
- 好程式設計師web前端培訓學習筆記Vue學習筆記之二程式設計師Web前端筆記Vue
- 分散式系統學習筆記分散式筆記
- 作業系統學習筆記作業系統筆記
- Node.js 設計模式 學習筆記 之 流程式設計Node.js設計模式筆記程式設計
- 黑馬程式設計師——Java學習筆記之⑦——“網路程式設計”程式設計師Java筆記
- JavaScript設計模式學習筆記JavaScript設計模式筆記
- php設計模式學習筆記PHP設計模式筆記
- CUDA學習筆記-1: CUDA程式設計概覽筆記程式設計
- python程式設計學習筆記⑦-1函式Python程式設計筆記函式
- shell指令碼程式設計學習筆記-運算子指令碼程式設計筆記
- shell指令碼程式設計學習筆記——變數指令碼程式設計筆記變數
- 程式設計學習筆記之訊息地圖程式設計筆記地圖
- JavaScript DOM 程式設計藝術 學習筆記01JavaScript程式設計筆記
- JavaScript DOM 程式設計藝術 學習筆記 02JavaScript程式設計筆記
- 作業系統學習筆記之初識程式和程式控制作業系統筆記
- 《通過遊戲程式設計實戰教新手學C++程式設計》學習筆記遊戲程式設計C++筆記