原文:http://www.cnblogs.com/ddx-deng/archive/2012/12/16/3755862.html
第一個結論:
#include "iostream.h"
void main()
{
1、 char str[]="abcdef";
2、int n[]={1,2,3,4,5};
3、char *p=str;//
4、 cout<<sizeof(str)<<endl;一個字母在內存中占一個字節,這里輸出7,7個字節但是6個字母,原因是字符串后面有一個‘\0’結束符,也占一個字節
5、cout<<sizeof(n)<<endl;一個int數據在內存中占用4個字節,輸出4*5=20
6、cout<<sizeof(p)<<endl;輸出4
7、p++;
8、str++;
}
7
20
4
看似指針和數組名是相同的,其實不然;第4行和第6行輸出結果不同就是證明,前者是字符數組長度7,而指針在32位機中是一個DWORD,4個字節,在64位中就是8了。
第二個結論:
第8句存在的話會編譯報錯,也就是數組名不能自加和自減,而指針可以。
(1)數組名的內涵在於其指代實體是一種數據結構,這種數據結構就是數組;//************這才是實質
(2)數組名的外延在於其可以轉換為指向其指代實體的指針,而且是一個指針常量;//********code
(3)指向數組的指針則是另外一種變量類型(在WIN32平台下,長度為4),僅僅意味着數組的存放地址!//********code
第三個結論:數組名失去原本內含,淪為指針。可以做自增自減操作。
#include "iostream.h"
void Fun(char str[]);
void main()
{
1、 char s[6];
2、 Fun(s);
}
void Fun(char str[])
{
cout<<sizeof(str)<<endl;
}
第2句的結果不再是6,而是指針大小4.
分析一個別人提問的例子:
#include "iostream.h"
void main()
{
int a[]={1,2,3,4,5};
int *ptr=(int *)(&a+1);//&a是不是取地址,還是引用?
cout<<*(ptr-1)<<endl;
cout<<*(ptr)<<endl;
}
最終輸出結果:5.
解釋1:a是一個數組名,上面說的,數組是一個數據結構;並且a已經能代表數據結構(本數組)的地址了,於是&a是對數據結構取地址,取得的地址+1會怎么樣?會指向下一個數據結構,但是這里只有一個數據結構。。。那么int *ptr=(int *)(&a+1);執行后ptr指向數據結構(int[5]的數組)的結束,a是數組,&a 就是指向數組的指針,&a+1所以位移5個int,*(ptr-1)又是int* 反位移1個,5-1=4,位移4位就是第五個數
解釋2:a是一個int[5]類型,所以&a+1就會到數組末尾,再減1就是5的位置