(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]=;
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= ;
double *pt= &t[3];//指向值為111
int *ptint= reinterpret_cast< int * > (pt);
char *ptch= reinterpret_cast< char * > (pt);
cout<< *( pt- 1)<< "\t"<< *(reinterpret_cast(ptint-2))<<"\t"<<
*(reinterpret_cast(ptch-8));//最後輸出結果全為578
---------------------
void fun( int *p)與void fun( int p)是一樣的,即函式列表中的陣列此時退化成了指標
陣列名,陣列首位址,a, a, a 0
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 a printf d n sizeof a 16 這裡的陣列名a表示整個陣列,計算整個陣列的大小,也就是4個整數,整型佔4個位元組,所以整個陣列的大小是4 4 16...
陣列 陣列名 陣列位址學習
先來看乙個例子,然後通過分析例子來學習 include int a 3 int main 結果 a 0x555e35977010 a 0x555e35977010 a 1 0x555e35977014 a 1 0x555e3597701c我們來逐個分析 1.陣列名的值是個指標常量,指向陣列的第乙個元...