1. 程式人生 > >重拾指標(整理自一個知乎上非常不錯的回答)

重拾指標(整理自一個知乎上非常不錯的回答)

大一上學期的時候學的C語言,在那時侯接觸的指標相關知識。過去半年果然把指標忘乾淨了。。。。

今天利用剩餘時間把指標相關知識複習一遍,把指標搞通!

1.指標中存在兩種操作運算子
1).&操作符:取地址符

 2).*操作符:對指標進行解引用的操作

記憶體可以簡化為一系列相連的無限長的單元,在單元中存放著數字,每個單元格為 1bite(1位元組),計算機的工作就是對這些單元格里的數字進行處理。對每個單元格上的數字能夠採取的操作只有寫入和讀取兩種操作。因為每個單元格都有自己獨有的編號,所以可以通過單元格的地址對單元格中的數字進行操作。
例如:

unsigned char a  = 1;//每個unsigned char 佔一個位元組。
unsigned char* b = &a;//利用&取出變數a的地址,並將a的地址存在b的單元格中。
printf("%d", *b);     //對指標b進行解引用操作得到a中存的值。

2.關於指標變數所佔記憶體大小的理解

因為每個單元格只佔一個位元組,許多變數都需要多個位元組來儲存,比如int型就需要四個位元組。故,不同指標型別所表示的變數所佔位元組數是不同的(佔的單元格數也不同)。
由此引入指標型別的概念,對於int型的指標型別,是指從變數開頭往下算四個單元格,而unsigned char型則只表示變數當前的格子。不同指標變數之間的轉換需要強制型別轉換。
例如:

unsigned int c   = 257;
unsigned int *a  = &c;
unsigned char *b = (unsigned char*)&c;

3)計算機使用二進位制表示數字。

對所有unsigned的整形變數來說,二進位制的值本身就代表了他自己的數值,257轉換成二進位制是:100000001,int型就是4個位元組。因為8位數字佔用一個位元組,所以int型就是32位數,補齊0後得到:00000000 00000000 00000001 00000001.8個8位數字轉換成10進位制,上面的數字即為0011.機器在讀取時看到是個int*型指標,故讀取對應地址的四個位元組所存的數字,反之機器在讀取是看到是char*型指標,只會讀取地址對應的第一個單元格。

4)關於指標的運算

假設有一個指標a,那麼a+1所代表的就是加上a的型別所佔位元組數所得到的新地址。至於指向不同資料型別的指標下一步後所指向地址的大小的不同在於指標的步長,指標步長由編譯器所決定。
減法也是一個意思,只不過對應的變數地址是從當前往前追溯對應資料型別所佔的格子。
指標之間可以相加,但是相加得到的結果沒有意義。

5)關於指標變數的大小

指標的大小由所存地址的寬度決定,和對應資料型別無關。

整理到現在差不多了,在整理的過程中突然很想學機器學習,或許這就是我的興趣所在吧。。