本課繼續講解了c語言的強制型別轉換,之後介紹了結構體,陣列以及結構體中的陣列。
*和&的技巧
例1:
取出d的位址,並重新解釋為char型,然後解引用。由於double為8bytes,而char為1bytes,因此ch表示的是原來double中擷取1bytes的結果。double d = 3.1416;
char ch = *(char*)&d;
例2:
取出s的位址,並重新解釋為double型,從2bytes變成8bytes,解引用後賦值給d。short s = 45;
double d = *(double*) & s;
位元組存放順序:大尾(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。
關於c語言中陣列沒有邊界檢查這個問題可以參考int array[10];
array[0]= 44;
array[9]= 100;
array[5]= 45;
array[10]= 1;//合法**
array[25]= 25;//合法**
array[-4]= 77;//合法**
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.函式 函式中定義變數和外部變數同名時,內部函式有效 變數名相同,但函式外和函式內...