陣列指標和指標陣列的區別

2021-07-25 23:01:19 字數 2311 閱讀 7510

陣列指標(也稱行指標)

定義 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 該語句是定義乙個陣列指標,指向...