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) 的時候就要將其強制轉型。

results matching ""

    No results matching ""