今天在讀《STL源碼剖析》空間配置器第二級時看到了這句,有點不解,於是查閱後知:
obj後面是個指針 STL_VOLATILE也應該是個類型定義的吧,程序中應該有define來對它定義。所以就是指針的指針。。
指針,也就是地址,所以是__my_free_list是一個地址,*__my_free_list指向的是__my_free_list這個地址所在存儲區的變量值。而 __STL_VOLATILE* __my_free_list的值也是一個地址, *__STL_VOLATILE* __my_free_list所指向的是 __STL_VOLATILE* __my_free_list 這個地址所在存儲區的變量的值,也就是__my_free_list這個地址。
說的很繞,換個說法吧,比如__my_free_list用A來代替、__STL_VOLATILE* __my_free_list用B來代替。
那就是A是一個地址,B也是一個地址,A這個地址裡面存放的數據也是一個地址,索性管這個被存放的地址叫做C,那麼C這個地址所在存儲區存放的是一個變量,*A就是指向這個變量;
而B這個地址裡面存放的也是一個地址,這個地址裡面存放的還是一個地址,這個地址不是別人,就是A,*B就等於C(C是個A那個地址裡面所存放的數據)。
嗯,是啊。obj後面是個指針 STL_VOLATILE也應該是個類型定義的吧,程序中應該有define來對它定義。所以就是指針的指針。。
指針,也就是地址,所以是__my_free_list是一個地址,*__my_free_list指向的是__my_free_list這個地址所在存儲區的變量值。而 __STL_VOLATILE* __my_free_list的值也是一個地址, *__STL_VOLATILE* __my_free_list所指向的是 __STL_VOLATILE* __my_free_list 這個地址所在存儲區的變量的值,也就是__my_free_list這個地址。
說的很繞,換個說法吧,比如__my_free_list用A來代替、__STL_VOLATILE* __my_free_list用B來代替。
那就是A是一個地址,B也是一個地址,A這個地址裡面存放的數據也是一個地址,索性管這個被存放的地址叫做C,那麼C這個地址所在存儲區存放的是一個變量,*A就是指向這個變量;
而B這個地址裡面存放的也是一個地址,這個地址裡面存放的還是一個地址,這個地址不是別人,就是A,*B就等於C(C是個A那個地址裡面所存放的數據)。
對於您這個問題我就是這樣理解的,說的也很繞,希望您看的懂哈。
#define outp_w(addr, dat) *(volatile UINT32*)(addr)=dat;
相當與
#define outp_w(addr, dat) *((volatile UINT32*)addr)=dat;
(volatile UINT32*)addr 將addr轉變為異變型指針
*((volatile UINT32*)addr) 是修改指針所指的值
其實就是一個宏而已
volatile
volatile declarator
The volatile keyword is a type qualifier used to declare that an object can be modified in the program by something other than statements, such as the operating system, the hardware, or a concurrently executing thread.
The following example declares a volatile integer nVint whose value can be modified by external processes:
int volatile nVint;
Objects declared as volatile are not used in optimizations because their value can change at any time. The system always reads the current value of a volatile object at the point it is requested, even if the previous instruction asked for a value from the same object. Also, the value of the object is written immediately on assignment.
One use of the volatile qualifier is to provide access to memory locations used by asynchronous processes such as interrupt handlers.