The difference between Array and Pointer

Array 和 Pointer 有什麼差別呢?

最常聽見的說法是 Array 是 Pointer 的一種特例,是在宣告的時候就已經將大小 allocate 出來的一種 pointer。本來我也是這麼認為的,可是看看下面的那個範例:

#include "stdio.h"
#include "stdlib.h"

int main()
{
unsigned char test[6];

test[0] = 0;
test[1] = 1;
test[2] = 2;
test[3] = 3;
test[4] = 4;
test[5] = 5;

printf("test: %X\n", test );
printf("&test: %X\n", &test );
printf("*test: %X\n", *test );
printf("*(test+1): %X\n", *(test+1) );
printf("*(&test): %X\n", *(&test) );

return 0;
}

顯示的結果如下

test: 76A21CA0
&test: 76A21CA0
*test: 0
*(test+1): 1
*(&test): 76A21CA0

其中 test, *test, *(test+1) 都沒有問題。有問題的是另外兩個。如果 array 和 pointer 是一樣的話,那為甚麼 &test = test 而不是等於 pointer 的 pointer 呢??本來想從 C99 來找答案,但實在不知道從何找起,結果發現網路上有一個很棒的網站:

Frequently Asked Questions in comp.lang.c

這個網站用一張圖來解釋其間的差異:

    +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+

    +-----+     +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+

其中,a 是 array 而 p 是 pointer。
看出其中的差別了吧,array 不會額外多一個空間來儲存 pointer 的位置。

所以其實上述的 &test 是一個非法的用法。

至於 *(&test) ... 我就真的不知道了,先紀錄起來吧。

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

Linux Virtual Interface: TUN/TAP