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
這個網站用一張圖來解釋其間的差異:
最常聽見的說法是 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) ... 我就真的不知道了,先紀錄起來吧。
留言
張貼留言