程式設計正規化 史丹福大學 學習筆記《三》

2021-08-21 07:52:39 字數 2200 閱讀 1026

本課繼續講解了c語言的強制型別轉換,之後介紹了結構體,陣列以及結構體中的陣列。

*和&的技巧

例1:

double d = 3.1416;

char ch = *(char*)&d;

取出d的位址,並重新解釋為char型,然後解引用。由於double為8bytes,而char為1bytes,因此ch表示的是原來double中擷取1bytes的結果。

例2:

short s = 45;

double d = *(double*) & s;

取出s的位址,並重新解釋為double型,從2bytes變成8bytes,解引用後賦值給d。

位元組存放順序:大尾(big endian),小尾(small endian)

位元組存放有大尾和小尾之分。如果對應資料的高位元組存放在低位址就是大尾,反之,高位元組存放在高位址的就是小尾。

例如:

short int a = 0x1234
大尾存放時:

偏移位址      存放內容

0x0000       0x12

0x0001       0x34

小尾存放:

偏移位址      存放內容

0x0000       0x34

0x0001       0x12

結構體

struct fraction;

fraction pi;

pi.num= 22;

pi.denom= 7;

(fraction*) & (pi.denom)) -> num = 12;//取pi.denom的位址,並重新解釋為fraction,因此變為8bytes(含兩個int型變數num和denom),然後將位於低位元組的num賦值為12。

(fraction*) & (pi.denom)) -> denom = 33;//同理,將位於高位元組的denom賦值為33。

//同理,將位於高位元組的denom賦值為33。

陣列

int array[10];

array[0]= 44;

array[9]= 100;

array[5]= 45;

array[10]= 1;//合法**

array[25]= 25;//合法**

array[-4]= 77;//合法**

關於c語言中陣列沒有邊界檢查這個問題可以參考

c/c++中索引超出陣列邊界問題

強制型別轉換時需要注意位元組問題:

int arr[5];

arr[3]= 128;

((short*)arr)[6]= 2;//arr被重新解釋成2bytes的short型,此時,之前賦值128的地方變為arr[7]

cout<< arr[3] << endl;//輸出的值為2的9次冪加上128

//arr被重新解釋成2bytes的short型,此時,之前賦值128的地方變為arr[7]

cout<< arr[3] << endl;//輸出的值為2的9次冪加上128

結構體中的陣列

struct student;

studentpupils[4];

pupils[0].numunits= 21;

pupils[2].name= strdup (「adam」);

pupils[3].name= pupils[0].void +6;

strcpy(pupils[1].suid,「40415xx」);

strcpy(pupils[3].name,「123456」);

pupils[7].suid[11]= 「a」;

記憶體大致可以如下圖所示:

void swap(int *ap, int *bp) ;
這個swap函式是為了說明:資料型別並不重要,重要是資料的二進位制位元組數。

程式設計正規化 史丹福大學 學習筆記《九》

接下來的課程會涉及到計算機體系結構和組合語言,解釋c c 片段是如何編譯成彙編 的,記憶體模型,函式呼叫,函式返回的型別等。4位元組變數的例子 int i int j i 10 j i 7 j 對應的彙編 m r1 4 10 store operation 將棧段中某個區域的值進行了更新 r2 m ...

史丹福大學開放課程 程式設計正規化學習筆記《二》

史丹福大學開放課程 程式設計正規化學習筆記 二 本課講述了c c 關於int,float等資料的底層表示,以及賦值操作所進行的處理。本節內容比較簡單,應該屬於組成原理的基礎知識,各種碼的表示和底層實現,但是,講述還不錯,特別是為何要這樣形成補碼,比單純記憶強多了,這樣才理解了取反加1的原因,比當初上...

《程式設計方法學》史丹福大學

程式設計方法學 史丹福大學 網易公開課 感悟 1.for 語句,可以使用i,j,k 變數 不需該意使用有意名字的變數 顯示它只是 計算器 一自就明白 2.注釋 一定要加注釋 3.使用長量 列舉 不建議使用全域性變數 4.函式 函式中定義變數和外部變數同名時,內部函式有效 變數名相同,但函式外和函式內...