這一段程序
下面這段程序很有看點:
//arr1 is an array of ints
int *source=arr1;
size_t sz=sizeof(arr1)/sizeof(*arr1);//number of elements
int *dest=new int[sz];
while(source!=arr1+sz)
*dest++=*source++;//copy element and increment pointers
1.source是一個指向數組arr1的第一個元素的指針.(開始時,*source與*arr1的值是一樣的.)
2.sizeof操作符的作用是返回一個對象或類型名的長度,返回值類型為size_t,長度的單位是字節.
3.對數組做sizeof操作等效於將對其元素類型做sizeof操作的結果乘上數組元素的個數.因為sizeof返回整個數組在內存中的存儲長度.
4.sizeof(*arr1),對指針arr1做sizeof操作,返回arr1所指的數組的第一個int型元素的類型長度.在這里,下面三種寫法是等效的:
sizeof(*arr1)=sizeof(*source)=sizeof(int)
5.source!=arr+sz,這里是在比較地址(沒有解引用),這里的數組名arr就自動轉化成了指向數組第一個元素的指針,加幾就指向其后面的第幾個元素.
6.比較sizeof(arr1)和sizeof(*arr1).arr1不解引用做sizeof操作,編譯器能判斷出來這就是一個普通的指針還是一個數組名指針,如果這是個數組名,就返回整個數組在內存中的存儲長度,否則就返回存放指針所需的內存大小,比如指針p里存放的地址是0x22ff50,那么存放這個地址需要4字節,則sizeof(p)返回4.而對於*arr1,這里arr1只是一個普通的指針.
-------------------------------
猜想
繼續研究上面的第六點,寫了這樣一段測試程序:
char a[7]={'1','2','3','4','5','6','7'};
char *b=&a[0];
char *c=a;
cout<<sizeof(a)<<endl;
cout<<sizeof(a+2)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
輸出的結果為:
7
4
4
4
那么,我想,或許真有數組名指針這種東西,也就是說指針a上可能有某種記號表明它是一個數組名,這種標志是數組創建的時候產生的,另一種可能就是指針a和7個數組元素存放的地址存在某種特殊聯系.