編譯器工作原理:在64位的計算機中,當創建一個指針變量時,計算機會為它分配8個字節的存儲空間。但如果創建的是數組呢?計算機會為數組分配存儲空間,但不會為數組變量分配任何空間,編譯器僅在出現它的地方把它替換成數組的起始地址。
結論1:由於計算機沒有為數組變量分配空間,也就不能把它指向其他地方。例題:
char s[]="How big is it?"; char *t=s; //正確,將數組的地址賦給指針變量t s=t; //錯誤,數組變量沒有存儲空間,無法存儲指針變量t的值,編譯報錯
結論2:如果對數組變量使用取地址符&,結果是數組變量本身。
#include <stdio.h> int main(int argc, char *argv[]) { int arr[3]={1,2,3}; printf("arr=%p\n",arr); printf("&arr=%p\n",&arr); return 0; } 結果為: fly@noi:~$ ./t arr=0x7ffed97ce8d0 &arr=0x7ffed97ce8d0
結論3:sizeof(數組)的值是數組的大小,sizeof(指針)是操作系統上一個地址的大小,64位機上是8個字節,32位機上是4個字節。
#include <stdio.h> int main(int argc, char *argv[]) { int arr[3]={1,2,3}; int *p=arr; printf("sizeof(arr)=%d\n",(int)sizeof(arr)); printf("sizeof(p)=%d\n",(int)sizeof(p)); return 0; } 輸出: fly@noi:~$ ./t sizeof(arr)=12 sizeof(p)=8
通過結論3可知:假如把數組變量賦給一個指針,那么指針變量只會包含數組的地址信息,而對數組的長度一無所知,相當於指針丟失了一些信息。我們把這種信息的丟失稱為退化。只要把數組變量傳遞給函數,數組免不了退化為指針,所以,把數組傳遞給函數,需要明確的指明數組的大小。向這樣:
int arr[3]={1,2,3}; int sum_arr(int arr[],int n); //用整型變量n明確指出數組大小
