陣列指標(也稱行指標)
定義 int(*p)[n];
()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長,也就是說執行p+1,
p要跨過n個整型資料的長度。
如果將二維陣列賦給指標,應該這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義乙個陣列指標,指向包含4個元素的一維陣列。
p=a; //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]
p++;//該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
所有陣列指標為指向一位陣列的指標,亦稱行指標
指標陣列
定義int *p[n]
優先順序高,先與p結合成為乙個陣列,再又int*說明這是乙個整型指標陣列,它又n個指標型別的陣列元素,這裡執行p+1時,
則p指向下乙個陣列元素,這樣賦值是錯誤的,p=a;因為p是個不可預知的表示,只存放p[0],p[1],p[2]......p[n-1],而且它們分別
是指標變數可以用來存放變數的位址,但可以這樣 *p=a;*p表示指標陣列第乙個元素的值,a的首位址的值
如要將二維陣列賦給一指標陣列:
int *p[3];
int a[3][4];
p++;//該語句表示p陣列指向下乙個陣列元素,
for(i=0;i<3;i++)
這裡 int *p[3]表示乙個一維陣列內存放三個指標變數,分別是p[0],p[1],p[2];
所以要分別賦值,這兩者的區別就豁然開朗了,陣列指標只是乙個指標變數,似乎c語言裡專門用來指標二維陣列的,它占用記憶體中乙個指標
的儲存空間,指標陣列是多少個指標變數,以陣列形式存放在呢稱當中,占有多高指標的儲存空間
表示陣列中i行j列乙個元素
*p(p[i]+j), *(*(p+i)+j), (*(p+i))[j],p[i][j];
討論a和&a之間的區別
既然這樣,那問題就來了,前面我們講過a和&a之間的區別,現在再來看看下面**:
int main()
char a[5]=;
char (*p3)[5]=&a;
char (*p4)[5]=a;
上面對p3和p4的使用,哪個正確呢 p3和p4都是陣列指標,指向的是整個陣列,&a是整個陣列的首位址,a是陣列元素的首位址,
但其一樣不同,在c語言裡,賦值符號」=「兩邊的資料型別必須相同,如果不同需要顯示或型別轉換,p3這個定義的」=「兩邊的資料型別完全一致,
而p4這個定義的"="兩邊的資料型別就不一致了,左邊的型別是指向整個陣列的指標,右邊的型別是指向單個字元的指標。編譯chux
warning c4047: 'initializing' : 'char (*)[5]' differs in levels of indirection from 'char *'。
int main() ;
char (*p1)[5]=&a;
char (*p2)[5]=(char(*)(5))a;
printf("a=%d\n",a);
printf("a=%c\n",a[0]);
printf("p1=%c\n",**p1);
printf("p2=%c\n",**p2);
printf("p1+1=%c\n",**(p1+1));
printf("p2+1=%c\n",**(p2+1));
return 0; }
輸出:a=1638208
a=ap1=a
p2=a
p1+1=?
p2+1=?
位址的強制轉換
int main() ;
int *ptr1=(int*)(&a+1);//指向a陣列後面的記憶體單元,&a+1表示向後移動16個儲存單元
int *ptr2=(int*)((int)a+1);//表示a的儲存單元的位址增加乙個位元組
printf(」%x,%x「,ptr1[-1],*ptr2);//ptr1[-1]其實指向的是a陣列的最後乙個單元,*ptr1則表示a陣列的位址後移乙個位元組之後的4個
連續儲存單元儲存
return 0; }
ptr1:將&a+1的值強制轉換成int*型別,賦值給int*型別的變數ptr,ptr1肯定知道陣列a的下乙個int型別資料了,ptr1[-1]被解析成*(ptr1-1),即ptr1往後退4個
位元組,所以其值為0x04,
ptr2 :按照上面的講解,(int)a+1的值是元素a[0]的第二個位元組的位址,然後把這個位址強制轉換成int*型別的值賦給ptr2,ptr2的值應該為a[0]的第二個位元組開始的連續4個位元組內容。
陣列指標和指標陣列的區別
陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...
陣列指標和指標陣列的區別
陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...
陣列指標和指標陣列的區別
陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...