資料在記憶體中的儲存和指標高階

2021-10-10 11:43:40 字數 2877 閱讀 1961

三、指標的高階

11月10日為止,基本學完了c語言的基礎知識,並且開始學習資料在記憶體中的儲存和指標高階的知識。在此總結一下當日所學。

如何呼叫結構體中的成員變數呢?有以下兩種方法:

1、如果是結構體變數,則使用.

2、如果是結構體指標,則使用->

另外,結構體作為函式的引數時,一般建議通過傳指標的方式來傳參。這是因為函式呼叫的時候會把實參拷貝乙份,若直接傳參,拷貝開銷會比較大,如果傳指標,由於指標的大小是固定的,開銷就很小。

借助偵錯程式來觀察記憶體中的詳細情況。

例如,定義乙個整型變數a,賦值為10。在位址列中對a進行取位址操作,就可以得到a在記憶體中的儲存情況。

如上圖所示,a在記憶體中按照十六進製制儲存。0a的位址就是0x00effe20,00的位址就是0x00effe21,以此類推。這種高位在左,低位在右的排列方式稱為小端位元組序

位元組序就是研究數字的高位在記憶體的高位址還是低位址。小端位元組序就是高位放在高位址,大端位元組序就是高位放在低位址。可以用小(低位)小(低位址)小(小端)來記憶。一台機器的位元組序取決於cpu,小端位元組序在pc上是主流。編寫函式判斷當前主機是哪種位元組序,**如下:

int

isbigend()

return0;

// 不建議寫成以下版本。不利於理解。

// return *((char*)(&num)) == 0x11;

}

若是正數,則按照原碼來存;若是負數,則按照補碼的方式來存。也可以理解成正數的補碼就是自身。補碼存在的意義在於把加法和減法統一成加法,使硬體實現更簡單。

原碼->取反+1->補碼

補碼->取反+1->原碼

ieee 754 標準規定了浮點數的儲存方式。實際上是使用了科學計數法來進行儲存。

s是符號位,0表示正,1表示負。e是指數部分,m是有效數字。m占用的bit位越多,資料的精度就越高;e占用的bit位越多,資料的範圍就越大。

由於double型別的精度和範圍均比float大,實際開發中優先考慮使用double。

由於浮點數在記憶體中儲存,很多時候有誤差,故實際開發中,不能在浮點數之間使用==進行比較。

float a =

19.0

;float b = a /

7.0;

#define n 1e-4

if(b *

7.0- a < n && b *

7.0- a >

-n)else

號c語言中的字元指標,可能有兩種含義:

1、指向乙個字元

2、指向乙個字串(是乙個特殊的字元陣列,以\0結尾)

如圖,此時p2中儲存的就是字串首元素的位址,知道了p2,就可以通過解引用和指標+1運算,把字串的每個元素都獲取到。此時就相當於使用p2來表示乙個字串了。

執行以下**:

char str1=

"hehe"

;char str2=

"hehe"

;char

* str3 =

"hehe"

;char

* str4 =

"hehe"

;// 此處陣列本來是不能直接比較的.

// 但是指標可以. 此處陣列名又隱式轉成指標了.

if(str1 == str2)

else

if(str3 == str4)

else

會發現第乙個不相等,第二個相等。首先明確,進行比較的是位址,而不是字串的內容。str1和str2所指向的字串雖然內容相同,但是位址不同,故比較位址時輸出不相等。而str3和str4都指向"hehe"這個字串,所以儲存了同乙個位址,故相等。

注意:c語言中,想要比較字串的內容,不能直接使用==,而要使用strcmp函式。

//指標陣列

int* arr[4]

=;//陣列指標

int arr2[4]

=;int(

*p)[4]

=&arr2;

指標陣列是陣列,陣列裡儲存的元素全部是指標。陣列指標是指標,這個指標指向一整個陣列,即&arr2+1是整個陣列的長度。

陣列作為函式引數時,有兩種傳參方式:

void

print

(int arr[3]

[5])

//或者

void

print

(int

(*p)[5

])//若 int a[5],a的型別就是int*

//若 int a[3][5],a的型別就是int(*)[5]

//若 int a[2][3][5],a的型別就是int(*)[3][5],以此類推。

資料在記憶體中的儲存

身為乙個天天處理資料的人,不得不說資料在記憶體中的儲存是必須要知道的問題。首先,資料在記憶體中的儲存涉及到作用域,儲存位置等方面的問題。根據資料的作用域,可將資料劃分為區域性變數和全域性變數 區域性變數的作用域為從定義開始到函式執行結束 全域性變數的作用域從程式開始到程式結束。計算機的記憶體分配可以...

資料在記憶體中的儲存

大端,把乙個數字高位位元組序的內容儲存到低位址,低位位元組序內容儲存到高位址處 小端,把乙個數字高位位元組序的內容儲存到高位址,低位位元組序內容儲存到低位址處 判斷乙個機器是大端還是小端?指標判斷 int checksys 聯合體 共用體 union un int main 這裡首先需要知道的是,例...

資料在記憶體中的儲存

我們都知道在計算機中資料型別都有 char 1 short 2 int 4 long 4 8 float 4 double 8 等內建型別,以及他們所佔的空間大小。型別的意義 1.使用這個型別開闢記憶體空間的大小 大小決定使用範圍 2.如何看待記憶體空間的視角。型別歸類 整形家族 char unsi...