Pointer - type
如果問讀者指標是什麼?我想大部分都會回答address。這答案沒有錯。我們考慮以下一段 code
int a = 0;
int *pa = &a;
char b = 0;
char *pb = &b;
我們在上面看到兩個一般變數以及兩個指標變數。接著上面的問題繼續問 - "既然你說指標是address,那為何要分 int * 跟 char *?"
一個實作上的原因就是 - 運算
假設 sizeof(int) = 4 . 當我們做 pa += 1 時會得到的就是 pa 在數值上改變了4. 而 pb += 1 就是改變 1.
那這個為什麼那麼重要?
另一個原因就是在 dereference 時我們一次要使用幾個byte來組成這個變數.
以上面的例子而言, 假設 a 佔了 0x0000a000 ~ 0x0000a003 共4 bytes。 假設 a == 0xaabbccdd
假設 pa == 0x0000a000
在使用時 *pa == 0xaabbccdd 就是對的.
而若要硬要讓 pb = pa 的話也可,只是在使用時, *pb 的只會是 0xaa or 0xdd (看 endian)
Void *
void* 是一個特殊的指標型態,當我們不在乎(或者想故意忽略)此指標型態時就會使用
int a;
short * pb;
void * c;
c = &a; //合法
c = pb; //合法
以下是一個 memcpy 可能的做法
void * memcpy(void * dst, const void * src, size_t n)
{
char * pd = (char *)dst;
const char * ps = (const char *)src;
while (n--)
*pd++ = *ps++;
return dst;
}
memcpy 使用是將 n 個 byte 從 src copy 到 dst
一個使用上的例子
int a = 0;
short b = 0xaabb;
memcpy(&a, &b, 2);
這邊我們希望把 b 的其中 2 bytes copy到 a 中。
可以注意到的是 memcpy 傳遞參數時, &a, &b 是不同型態的,也沒有將其強制轉型。
但是如果我們prototype 使用 memcpy(char * a, char * b, size_t n) 的時候就要將其強制轉型。