嵌入式系統中往往需要讓程式跳到記憶體的某個位址去執行,比如想讓程式跳轉到絕對位址是0x100000去執行,應該怎麼做?
這樣:*
((void(*
)(void
))0x100000
)();
即可。解釋一下,想讓程式跳到某個絕對位址去執行得用函式指標,這或許也是函式指標的乙個妙用吧!
語句void(*)(void)宣告了乙個返回值是void、無引數的函式的函式指標,這個指標沒有名字但有指向的位址。就是說位址0x100000是乙個返回值是void、無引數的函式的起始點,其實就是函式名,這裡也印證了函式名就是函式位址。拆開看看:
void(*
)(void
)0x100000
這個傢伙是個指標,函式的實際位址在它指向的地方,所以需要取內容,於是就*(void (*)(void)0x100000)。這樣一來這個表示式就是這個「函式的位址了」,也就是函式名,函式名後面打個括號加上引數就行了,於是最後就是*(void (*)(void)0x100000)()。
也可以這樣理解:
首先要將0x100000強制轉換成函式指標,即:
(void(*
)(void
))0x100000
然後再呼叫它:
((void(*
)(void
))0x100000
)();
用typedef可以看得更直觀些:
typedef
void(*
)() voidfuncptr;
*((voidfuncptr)
0x100000
)();
你可能很快就會這樣做:
unsigned
long*p
=0x00001234
;//讀
intvar1 =*
p;//寫
*p =0x1111;
這樣不錯,不過你為了讀寫這四個位元組的區域宣告了乙個指標變數,指標變數本身佔4個位元組,如果p以後還有很多任務作也就罷了,如果它從此就不再使用了,那麼這樣做就純屬沒必要,還高的變數多看花了眼,可以這樣:
(*((unsigned
long*)
0x00001234)) //讀
intvar =(
int)(*((
volatile
unsigned
long*)
0x00001234
));//寫
*((volatile
unsigned
long*)
0x00001234) =
0x1111;
嵌入式系統中常用的讀寫暫存器的方法就是這樣,比如:
#define
reg_1 (*((volatile unsigned long *)0x00001234))
那麼就可以隨意的操作暫存器reg_1了。
相對位址轉絕對位址
發乙個相對位址轉絕對位址的函式 今天在研究jquery ajax功能的時候遇到乙個問題,通過 load url a load乙個網頁的鏈結後獲取到的位址資訊是相對於當前執行ajax程式的網頁的絕對位址。比如我在 c x a.html 網頁執行 www.romotc.com 網頁中有乙個鏈結 a bo...
URI URL URN,相對位址 絕對位址
uri uniform resource identifier 標準資源標示符,可以進一步分為定位器 名稱,或者二者兼具 通過一定規則解碼可以得到資源位置 在html中的href採用的是uri引用 uri引用分為絕對引用和相對引用 絕對引用以方案名和冒號開頭,其他為相對引用 url uniform ...
相對位址和絕對位址
什麼是相對位址 document.location.href 就是相對位址跳轉,這個方法實現的是在當前路徑的基礎上進行跳轉 什麼是絕對位址 網路位址顧名思義就是直接跳轉到網路的位址,以http或者https等開頭的位址,這種位址可以直接跳轉到頁面 本地位址如果沒有特別說明在哪乙個盤,那麼所有的跳轉都...