嵌入式每日學習心得2017 07 18

2021-08-03 22:24:41 字數 3682 閱讀 7050

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...