2009年3月13日

[工作] 用三小指標~

最近加扣加到天昏地暗

學到的東西正是以前一知半解的星星和搭樂賽~

因為常常要對最底層的暫存器做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後才學會指標的

以前研究所的時候也用過

不過沒有用到像現在這麼出神入化(對以前的我而言)

算有成長吧



總之有成長就是一件好事~~

沒有留言: