嵌入式開發 C語言指標 記憶體空間(1 3 2)

2021-10-09 15:25:31 字數 2689 閱讀 1772

記憶體型別資源位址、門牌號的代名詞

指標指標變數 : 存放指標這個概念的盒子

int a;

int *p;

char *p;

c語言編譯器對指標這個特殊的概念,有2個疑問?

1、分配乙個盒子,盒子要多大?

在32bit系統中,指標就4個位元組

在64bit系統中,指標就8個位元組

2、盒子裡存放的位址 所指向 記憶體的讀取方法是什麼?

指標指向記憶體空間,一定要保證合法性

0x12 0001 0010

1.0 浮點數在記憶體中並不是0001 0000,浮點數在記憶體中表現形式很特殊。

常量、唯讀【不能變】

記憶體屬性:

1、記憶體操作的大小

2、記憶體的變化性,可寫可讀

char *p;

const char *p; 對於p指向的內容盡量不去修改它,唯讀空間 字串 「 hello world」 「aaa」

char const *p;

以上兩種是一樣的

char * const p; 指向固定位址,但是裡面內容可變 硬體資源 lcd

char *p const;

以上兩種是一樣的

const char * const p 【內容和位址都不可變】 rom

例子:#include

int main()

會出現段錯誤,雙引號裡面是位址常量,是不可變的。

即雙引號可以理解為const char *p;

volatile:硬體裝置訪問時候應該會有,純軟體應該很少遇到。防優化,可能看看之前的例子。

char *p;

什麼型別 變數名稱;

char *name_t : name_t是乙個指標,指向了乙個char型別的記憶體

typedef char *name_t; name_t是乙個指標型別的名稱,指向了乙個char型別的記憶體

name_t abc;

char *p;

p++;

p–;int main(int argc ,char **ar**)

*/return 0;

}那麼,總的來說 ,對於我們實際開發中來說,我們大部分能用到二級指標就可以了。**指標幾乎是用不到 ,其實更多級指標還是一樣的,只是一種方式,我們說其實就是線性表的線性表的然後得到位址的空間,這樣的話呢,從我們解決問題的角度來講其實也沒有什麼好處,對不對哎,所以我們在設計程式的時候,其實盡量的不要去想**指標。

最多我們用到二級指標其實就已經能夠把我們的邏輯,闡述的足夠清楚了。 我們要按照這樣的思路去 設計,這樣的話呢,我們程式可能易讀性會更強一點,你不要認為你用的級數越多好像就是越牛啊,其實並不是這個意思,因為你的級數越多你所描述的事情,你讓別的程式設計師去猜測你的意思是很難的。因為我們在讀**的時候其實就是在讀什麼乙個人」他在設計這個問題的解決方案啊的乙個想法啊」。所以這個希望大家能夠理解,盡量不用二級以上的指標。

手擼strncpy**。

隨著現在的硬體的公升級啊,很多硬體可能他幫我們做一些事情了,所以有些時候strncpy的**裡頭你會發現一些很奇怪的組合語言嵌進去了啊,那這個好處主要在於什麼,主要我們開發過程中stncpy的效率可以進一步的提高啊,所以說呢,有些時候我們在面試啊,尤其像面試嵌入式開發工程師的時候啊, 可能有些有些面試官他會很無聊的問,你們去寫個strncpy吧,或者寫個什麼strlen這樣的一些標準函式啊,那當然你可以先把我們的標準形式寫出來,然後你一定要附一句話,根據cpu的體系結構不同以及cpu的能力啊,那麼這段程式是可以改變的,可以更加優化啊,這個我們先放著,等以後我們看到具體的cpu過後我們可能在跟和核心中,為什麼strncpy不是我們 想象的那麼簡單啊 ,那麼只是說我們 現在能夠猜測出來它的目的是這個目的, 但內部做細節我們現在不敢說一定是這個。不同的cpu有不同的效果,但我們先大概理解成這個樣子,strncpy可以暫時理解成逐位賦值的這樣一種方式。

char buf[10] -------->>這個是乙個string,是字元

unsigned char buf[10]----->>data,使用記憶體的時候,盡量用unsigned char

32位系統中,cpu一執行,盡量的保證整個資料匯流排都充滿,這樣效率是最高。

所以效率最高的讀取方式,是一次讀4個位元組,即32bit

效率,希望犧牲一點空間換取時間的效率

最終結構體的大小一定是4的倍數

結構體裡成員變數的順序不一致,也會影響到他的大小

------------------------------------------ 4g

核心空間 應用程式不許訪問

------------------------------------------ 3g

棧空間 區域性變數 (rw) 執行時,函式內部使用的變數,函式一旦返回,就釋放,生存週期是函式內

------------------------------------------ ?

執行時的堆空間 malloc 執行時,可以自由,自我管理的分配和釋放的空間,生存週期是由程式設計師來決定

------------------------------------------ ?

全域性的資料空間 (初始化的,未初始化)command:size static rw data bss

唯讀資料段 「hello world」 字串常量 r text

**段 code r text

------------------------------------------ ?

0x0 :

C語言指標(1)嵌入式linux

計算機中所有的資料都必須放在記憶體中,不同型別的資料占用的位元組數不一樣,例如 int占用4個位元組,char 占用1個位元組。為了正確地訪問這些資料,必須為每個位元組都編上號碼,就像門牌號 身份證號一樣,每個位元組的編號是唯一的,根據編號可以準確地找到某個位元組。我們將記憶體中位元組的編號稱為 位...

嵌入式C語言開發學習筆記 記憶體陷阱

參考 博文01 博文02 參考 嵌入式系統高階c語言程式設計 這本書有空好好看看 1.記憶體分配方式 1 從全域性儲存區 靜態儲存區 分配。何時分配 程式編譯時 生存週期 整個程式執行期間 例子 全域性變數 static變數 2 在棧 stack 上建立。何時分配 函式執行時 生存週期 變數作用域期...

嵌入式C開發

將n左移m位 int byte to left move int n int m if n 1 if n 1 return ret 將n右移m位 int byte to right move int n int m if n 1 if n 1 ret n return ret 閒著無聊,自己寫了兩個...