2016年11月10日 星期四

C: pointer arithmetic

http://stackoverflow.com/a/394777 得到了我想要的答案。

當你寫 (a_pointer + a_number) 的時候,實際上是:
(a_pointer + (a_number * sizeof(*a_pointer)))

總之先拿 code 來觀察一下,

#include <stdio .h>

int main() {

    int a[10];
    int *p = a;

    printf("a = %p\n", a);
    printf("a + 1 = %p\n", a + 1);

    printf("&a     = %p\n", &a);
    printf("&a + 1 = %p\n", &a + 1);

    printf("&p     = %p\n", &p);
    printf("&p + 1 = %p\n", &p + 1);

    return 0;
}

會得到以下的結果(記憶體當然不會一樣,不過可以觀察一下差距)

a       = 0x7fff56c39650
a + 1 = 0x7fff56c39654
// 相差了 4 bytes,也就是一個 int 大小

&a       = 0x7fff56c39650
&a + 1 = 0x7fff56c39678
// 相差了 40 bytes,也就是一個 a 的大小(sizeof(int) * 10 = 4 * 10)

&p       = 0x7fff56c39640
&p + 1 = 0x7fff56c39648
// 相差了 8 bytes,也就是一個 pointer 大小(64bit 的系統下)


沒有留言:

張貼留言