c語言定義的五大記憶體空間
1.棧區 (stack):(區域性變數,形參)
filo (先入後出),函式的形參和區域性變數,存放在這個區。由編譯器自動分配,自動釋放。
2.堆區(heap):(申請空間)
這個區,由程式設計師申請後使用,使用完了,需要手動釋放。否則,會造成記憶體洩漏。
一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶
(申請空間的函式有:malloc --- free ; new --- delete )
3.全域性區(靜態區)(static):(全域性變數和靜態變數)
全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在
相鄰的另一塊區域。程式結束後由系統釋放。
4.文字常量區:(存放常量)
常量字串就是放在這裡的,直到程式結束後由系統釋放。
char a='9';
char a="zmx";
char *a=;
12=92;
5.**區:
存放函式體的二進位制**
void *malloc(size_t size);
void free(void *p);
變數的作用域和生存期
從變數的作用域(即從空間)角度來分,可以分為全域性變數和區域性變數。從另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分
為靜態儲存方式和動態儲存方式。
1.作用域(scope):起作用的**範圍
根據作用域不同,變數分為區域性變數和全域性變數
只有在變數的作用域範圍內才能訪問變數
不同作用域的區域性變數可以同名,不衝突
(1)區域性變數:
(2)全域性變數:
用static關鍵字定義的全域性變數稱為靜態全域性變數。
用extern關鍵字定義的全域性變數稱為外部變數
關於區域性變數的作用域還要說明以下幾點:
1) 主函式中定義的區域性變數也只能在主函式中使用,不能在其它函式中使用。同時,主函式中也不能使用其它函式中定義的變數。
因為主函式也是乙個函式,它與其它函式是平行關係。這一點是與其它語言不同的,應予以注意。
2) 形參變數是屬於被調函式的區域性變數,實參變數是屬於主調函式的區域性變數。
3) 允許在不同的函式中使用相同的變數名,它們代表不同的物件,分配不同的單元,互不干擾,也不會發生混淆。
4) 在復合語句中也可定義變數,其作用域只在復合語句範圍內。
5)如果同乙個原始檔中,外部變數與區域性變數同名,則在區域性變數的作用範圍內,外部變數被「遮蔽」,即它不起作用。
從另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。
使用者儲存空間可以分為三個部分:
1) 程式區;
2) 靜態儲存區;
3) 動態儲存區;
對靜態區域性變數的說明:
1) 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬
於動態儲存類別,佔動態儲存空間,函式呼叫結束後立即釋放。
2) 靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當
於執行一次賦值語句。
3) 如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而
對自動變數來說,如果不賦初值則它的值是乙個不確定的值。
register變數(暫存器變數)
為了提高效率,c語言允許將區域性變數的值放在cpu中的暫存器中,這種變數叫「暫存器變數」,用關鍵字register作宣告。
說明:1) 只有區域性自動變數和形式引數可以作為暫存器變數;
2) 乙個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數;
3) 區域性靜態變數不能定義為暫存器變數。
自定義函式
函式的定義
函式的宣告
函式的呼叫
在呼叫乙個函式時,程式執行流程會跳轉到該函式內部去執行,並且會將實參的值傳遞給形參變數(值傳遞),即用實參初始化形參變數,當該函
數執行結束返回後,程式執行流程會回到函式呼叫處,繼續往下執行
虛實結合:在呼叫函式時,形參變數才被定義(建立,分配儲存空間),並接收實參傳遞過來的值(即被實參初始化),在函式返回後,形參變數
將被銷毀(釋放其占用的記憶體空間),即不復存在
函式可以巢狀呼叫,但不能巢狀定義
主函式和普通函式的區別:
1.主函式是由作業系統親自呼叫,而普通函式是被主函式直接或間接呼叫
2.主函式返回會導致程序結束,而普通函式返回沒有這個影響力
遞迴函式:自己呼叫自己的函式
編寫遞迴函式要把握兩點:
1.遞推關係
2.遞迴結束條件
包含標頭檔案時,如果使用雙引號,那麼編譯器會優先去當前工程目錄下搜尋;如果使用尖括號,那麼編譯器則優先去系統頭檔案目錄
(比如/usr/include等)下搜尋
編譯:compile
編譯器:compiler
將工程目錄下的每個原始檔都編譯(通過編譯器)成對應的目標檔案(linux平台為.o,是二進位制檔案,但無法執行),然後將所有目標文
件和庫檔案鏈結在一起(通過鏈結器)構成最終的可執行檔案
注意:每個原始檔都是單獨編譯的
shell程式設計基礎
shell指令碼,是包含若干個linux命令的檔案,字尾名是.sh。可以使用vi file.sh,建立 file.sh 檔案。
執行shell程式檔案有三種方法:
(1)sh shell_file
(2)source shell_file
(3)./shell_file
在編寫shell時,第一行一般要指明系統需要哪種shell,並解釋shell程式。如:
#!/bin/bash (我們學這種shell)
#!/bin/csh
#!/bin/tcsh
bash shell 結構
(1)shbang 行:
是指令碼的第一行,由#!和shell的完整路徑組成。它通知核心使用哪種shell解釋指令碼中的行。
(2)注釋:
由# 後跟描述性的說明組成,位置任意。
(3)萬用字元:
(1) * : 匹配任意長度的字串 rm *.c
(2) ? : 匹配乙個長度的字串 vi 1_struc?.cpp
(3)[...] :匹配指定的字元 rm [12345].c
(4)[.-.] :匹配乙個範圍的字串 rm [1-5].c
(4) 顯示輸出:
echo 命令,用於向螢幕顯示輸出
(5)區域性變數(declare函式)
(6)全域性變數(環境變數)(export命令)
(7)提取變數值 ($)
(8)讀取使用者輸入
(9)引數
(a)陣列
(b)命令替換
(c)算數運算
(d)運算子
(e)條件語句;迴圈語句;
(f)函式
shell中的變數
使用者自定義變數在linux系統支援的shell中,都可以用賦值符號「=」給變數賦值,所賦的值要用引號括起來。如果需要使用這個變
量,則在變數前面加乙個「$」
嵌入式每日學習心得2017 07 08
linux系統管理技術 linux系統的使用方式 1 桌面環境操作 傻瓜化,但功能不夠強大,某些操作效率很低甚至無法完成 2 shell命令 專業高效,但非常不直觀友好,學習難度大,需要記憶命令 要成為unix linux系統骨灰級玩家,必須常用掌握shell命令!常用的桌面環境 gnome kde...
嵌入式每日學習心得2017 07 10
對於linux相關命令,再次作一點總結,今天是上半部分,明天是下半部分 關於布置的小問題 問題1更改使用者名稱 usermod l newusername username 問題2更改主機名 hostname newname vi etc sysconfig network 問題3su和su 的區別...
嵌入式每日學習心得2017 07 13
進製 表數方式,是幾進製,就逢幾進一 十進位制 逢十進一 9 0 123 10 百 十 個 1 3 0 二進位制 逢二進一 1 0 2 八進位制 逢八進一 7 0 0123 八 十 3 8 0 2 8 1 1 8 2 八 二 001 010 011 十六進製制 逢十六進一 f a 9 0 0x321...