最近加扣加到天昏地暗
學到的東西正是以前一知半解的星星和搭樂賽~
因為常常要對最底層的暫存器做r/w
基本上我這個人就是喜歡直接點
所以大部份的時候我都是用"立即定址法"
看要存取多大的資料
1個byte就用恰星星
2個byte就用硬特星
4個byte就用long int*
位置就直接給定值了
管它
這篇文章只是分享一下最近學到的星星和搭樂賽
其實搞懂了以後
這兩個東西不過就是運算子
跟加減乘除是差不多的
首先來講星星
星星就是"存取該指標裡頭的值"
講指標太麻煩
對計算機對程式有點概念的人都該知道
電腦所有的資料都會放在某個storage space
這種東西就跟地址一樣
一般我們常用的x86的位址線是32條
所以定址的話就是2的32次方
以16進位來表示就是0x12345678
共8個數字
這8個數字就是所有資料所在的地置~
就像我住在台北,小可愛住台南,陳鵬元在當兵,朱小玉假日就在高雄一樣
當我們知道了某個地方,比方說0x12345678這個地方,放著一個密碼值
這個密碼值是8位元也就是1個byte的長度時
我們要怎麼得到這個值呢?
這時就要拜請星星出來了~~
星星這個運算元就是在做這種事的
1個byte相當於1個character
於是我們只需要 *(char*)0x12345678
這樣就可以拿到這個值了
很難懂嗎?
慢慢的來看*(char*)0x12345678這個東西
首先0x12345678只是一個數字
接著(char*)
這是c語言的一個特別功能
它能轉換資料型態
底下這個例子
(char*)0x123456578就是要告知電腦一件事
0x12345678不再只是數字了
經過他冠了一個夫姓後
他現在身份不同了
它現在是一個位置~
而這個位置是一個byte~
接著再幫它冠上一顆星星
也就是變成*(char*)0x12345678
那它就變成了放在這個位置的值了
很深奧嗎?
我知道的~~這個真的很難懂
要講到你懂實在很難
不過當你碰到了這個東西後
有在用了之後
就會發現他真的是很好用!!
接著是搭樂賽
就是&
它在幹啥的?
我們在寫c的時候
會宣告許多不同的資料型態
就像是 int my_birthday; char my_name;
像上面兩個宣告
c的編譯器就會幫你在電腦的主記憶體找了一個2byte的空間放你的生日,再找1byte的空間放你的名子
那搭樂賽&它就是可以幫我們找到他存放在電腦記憶體的哪個地方
假設我們做了下面的運算
&my_birthday
這樣我們就可以知道我的生日被存在電腦的什麼地方
假設這個值 my_birthday = 18
那我做了 &my_birthday 便會得到一個位置 假設它是0x87654321
接著在把星星拿來玩 *&my_birthday 會是多少? 答案是18
那&*&my_birthday咧?答案是0x87654321
當然*&my_birthday和&*&my_birthday是還蠻沒意義的
星星和搭樂賽用法大概就是這個樣子
妙用在哪?
這個就要講到程式語言講的call by address和call by value了
一般一個函數,就像以前國中學的f(x)
這個x在C語言裡可以是一個實際的value,也可以是一個放這個Value的位置
放位置的時候,我們可以直接在call function的時候在function裡就對該位置上的value作更動了
就某些狀況來說
有助於減少程式碼,也可以少coding一些
程序減少了,程式跑起來也不會有過多的assign的command
程式變小了~~也變快了~~
不過壞處的話
程式變小了變快了~~但debug也會累多了
好久沒打程式文了
說來汗顏啊~~其實我是接了這次的project後才學會指標的
以前研究所的時候也用過
不過沒有用到像現在這麼出神入化(對以前的我而言)
算有成長吧
總之有成長就是一件好事~~