(1)指標數組: 是數組,但數組中的每個元素都是指標
int *p[5];//如p[2]是指標,可*p[ 2]=3;
(2)指向數組的指標: 是個指標,但它指向的是一個數組
int a[5];
int (*p)[5];//與前一行比較,*p相當於a,即p=&a;就像:int m;int *pm;//*pm就相當於m.pm=&m;
p= &a;//可與前一行合并為int (*p)[5]=&a;
----------------------
a代表這個數組,它是一個指標,指向第一個元素
這裡一定要記住,a是數組名,&a代表的不是取a這個變數的地址,而是取數組元素的地址
---------------------------------------
a 的類型是 int[5] 數組
&a 的類型是 int(*)[5] 指標——指向int[5]數組的指標
&a[0] 的類型是 int * 指標——指向int類型的指標。
sizeof(a)=20;
sizeof(*a)=4; 因為有取值符*,表示把a當成一個指標(int*),而a指向數組的首地址,
即a=&(a[0]),即sizeof(*a)=sizeof(*&(a[0]))=sizeof(a[0])=sizeof(int)=4。
sizeof(*&a)=20;//因為p=&a,所以=sizeof(*p),而*p=a,所以=sizeof(a)=20;
---------------------------------------
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));//輸出:2,5
指標加1要根據指標類型加上一定的值,不同類型的指標+1之後增加的大小不同,指標只是一個記憶體位址,但指標指向地址的長度可能不同,如char *pc與int *pi,sizeof(pc)=sizeof(pi)=4,但為什麼輸出時,cout<<*pc只從記憶體處取一個字元,而cout<<*pi則從記憶體處取4個字元,這是由指標類型(char,int)決定的.對A* p;p+1=(A*)(p的地址值+sizeof(A)),如pc+1=pc+sizeof(char)=(char*)(pc的地址值+1個位元組),而pi+1=pi+sizeof(int)=(int*)(pi的地址值+4個位元組).
對代碼中的&a+1,&a是數組指標,其類型為int (*)[5],因為p=&a,也即是p的類型.所以&a+1=&a+sizeof(A),其中A為int[5]:(把A=int[5]代入A* p,即相當於int(*p)[5]).所以&a+1=&a的地址值+5*4位元組,即變為數組a的結束位址的下一個地址(即&a[5]),&a+1仍是int (*)[5]類型,經(int *)(&a+1)強制轉化為int*,賦值給ptr.後面的ptr-1=ptr-sizeof(int)=ptr的地址值-4個位元組,即變為數組a的最後一個元素的地址&a[4],*(ptr-1)即為a[4],故輸出為5.
而a+1=a+sizeof(int):(此處a退化為int*,故對於A* p,A為int)=a的地址值+4個位元組,即是&a[1],則*(a+1)即a[1],故輸出2.
又如:
double t[]={1, 2, 578, 111,90} ;
double *pt= &t[3];//指向值為111
int *ptInt= reinterpret_cast< int * > (pt);
char *ptCh= reinterpret_cast< char * > (pt);
cout<< *( pt- 1)<< "\t"<< *(reinterpret_cast<double*>(ptInt-2))<<"\t"<<
*(reinterpret_cast<double*>(ptCh-8));//最後輸出結果全為578
---------------------
void Fun( int *p)與void Fun( int p[])是一樣的,即函數列表中的數組此時退化成了指標