1.c語言對位址的封裝(通過變數訪問記憶體)
(1)int a; 把變數a和某個位址繫結,當編譯器看到int a這句話時,第一步:通過int確定要分配的變數的記憶體位址的大小,並記錄該位址,第二步:看到a這個變數名,把剛剛記錄下來的位址和變數a繫結起來,以後要找某乙個位址的內容時就找與之對應的變數,這樣一來,對於我們來說,在使用資料的時候不用記住哪乙個資料存放在哪乙個位址裡面了,只需要找相應變數即可。在組合語言裡面沒有這樣的封裝,所以使用起來很麻煩。
(2)資料型別的作用: 分配記憶體的大小和解析(儲存)方式
不同的變數占用的記憶體大小是不一樣的,而記憶體是連續的,怎麼劃分取決於資料型別和其他管理方式(堆、棧等)。舉例:int a=110;float a=3.14;編譯器怎麼想?當編譯器看到int a=110;時,第一步:看到int 得知我要儲存的資料是整形的,於是給它分配四個位元組記憶體,第二步被儲存的資料a=110;然後把110按照int所規定的方式把110儲存到分配的四個位元組中,當編譯器看到float a=3.14;時,第一步:看到float 得知我要儲存的資料是實型的,於是給它分配八個位元組記憶體,第二步:被儲存的資料a=3.14;然後把3.14按照float所規定的方式把3.14儲存到分配的八個位元組中。
(3)(int)100和(int*)100有什麼區別?
首先都代表是強制型別轉換,當編譯器看到(int)100時,編譯器怎麼想?第一步:看到括號裡面有個資料型別,知道這是乙個強制型別轉換,知道了要把後面的位址轉換成int型別的,因為int型別的變數佔4個位元組,所以要把後面的位址轉換成連續的四個位元組,第二步:看被強制轉換的位址是誰,一看是記憶體位址100,是乙個位元組。要補齊四個位元組,於是把記憶體位址為100、101、102、103這四個位址儲存的資料按照int型別的儲存方式進行讀寫。
再來看(int*)100;第一步:編譯器看到括號帶有型別,知道這是乙個強制型別轉換,第二步:括號裡面是乙個int*型別的指標,再看指標的位址是100,於是把100號記憶體位址以及後面連續的四個位元組(100、101、102、103)存放的資料(假設是200)當成乙個指標,該指標指向了乙個位址(200號),再把200號位址裡面的資料按照int型別的解析方式進行解析,也就是把200、201、202、203這四個位址當做存放int型別變數的記憶體。
(4)函式名的含義:函式名的本質也是乙個位址,代表一段**的首位址
(5) int a[10]; //陣列名繫結的是陣列的首元素的首位址。也就是說a只佔乙個位元組
(1)int a =10;int* p=&a;這個指標p佔記憶體多大?所有的指標佔乙個位元組的記憶體,那麼這裡的int*p是不是浪費了三個位元組?
之前有個誤區,一直以為指標佔乙個位元組,經過測試在32位機器上,指標是佔四個位元組的,int*p=&a;a本身佔四個位元組,要存放它的位址的指標也得是四個位元組。
(2)(int*)p;這個int是讓p的位址先轉換成四個位元組,還是p指向的變數佔四個位元組?
p指向的變數是四個位元組的,所以指向它的指標也是四個位元組的。
如果不是再次整理得話,我還真不知道自己原來還有這麼多盲區,看來以後需要多加練習了,這次整理用了三個多小時,還行吧,收穫挺大的,可能在這次在整理中還有很多疏漏,以後時常回頭再來發現它,加油吧!
14 C語言 陣列
c 語言支援陣列資料結構,它可以儲存乙個固定大小的相同型別元素的順序集合。陣列是用來儲存一系列資料,但它往往被認為是一系列相同型別的變數。陣列的宣告並不是宣告乙個個單獨的變數,比如 number0 number1 number99,而是宣告乙個陣列變數,比如 numbers,然後使用 numbers...
1 4 C 語言基礎 陣列
type arrayname 宣告乙個int陣列 int arry 宣告的時候指定陣列的長度為5 這個時候的初始化值為0 int arry2 new int 5 宣告的時候初始化值 初始化的值個數必須和指定的長度匹配 int array3 new int 5 字串陣列 string arrstr 陣...
C語言基礎 1 4 C語言陣列
字元陣列與字串 字元陣列的輸入和輸出 字串拷貝 字串比較 字串連線 getch 函式包含在conio.h的標頭檔案中。避免資料溢位 3 1 include int main 3 2 include include int main else if a 2 0 else if a 4 0 else e...