***************************************************
更多精彩,歡迎進入:http://shop115376623.taobao.com
***************************************************
C++中int *p[4]和 int (*q)[4]的區別
前者是指針數組,后者是指向數組的指針。更詳細地說。
前: 指針數組;是一個元素全為指針的數組.【數組中的元素為指針】
后: 數組指針;可以直接理解是指針,只是這個指針類型不是int也不是char,而是 int [4]類型的數組.(可以結合函數指針一并看看......)
int*p[4]------p是一個指針數組,每一個指向一個int型的
int (*q)[4]---------q是一個指針,指向int[4]的數組。
兩者在定義的時候如下:
int k;
cin>>k;
char *p[2];
p[0]=new char[k];
p[1]=new char[k];
char (*b)[2];
b=new char[k][2];
這樣空說是不是依舊小白?舉個例子
- #include?<iostream>???
- using?namespace?std;???
- ??
- int?main()???
- {???
- ????int?*p[4];?//p是一個指針數組,每一個指針都指向一個int型數據???
- ????int?a=1,b=2,c=3,d=4;??
- ????int?i;??
- ????p[0]=&a;??
- ????p[1]=&b;??
- ????p[2]=&c;??
- ????p[3]=&d;??
-
- ????int?(*q)[4];//q是一個指針,指向int[4]數組???
- ????//q[0]=&a;//error???q是指向int[4]數組的指針,而&a是一個int型指針,所以不能賦值???
- ????int?aa[4]={5,6,7,8};??
- ????q=&aa;??
- ????cout?<<?"p的值:"?<<?p?<<?endl;?//注意,p不等于p[0]???
- ????cout?<<?"p[0]的值:"?<<?p[0]?<<?"??a的地址:"?<<?&a?<<?endl;??
- ??????
- ????cout?<<?"p[0]地址保存的值:"?<<?*(p[0])?<<?"??a的值:"?<<?a?<<?endl;??
- ????cout?<<?"p[1]地址保存的值:"?<<?*(p[1])?<<?"??b的值:"?<<?b?<<?endl;??
- ????cout?<<?"p[2]地址保存的值:"?<<?*(p[2])?<<?"??c的值:"?<<?c?<<?endl;??
- ????cout?<<?"p[3]地址保存的值:"?<<?*(p[3])?<<?"??d的值:"?<<?d?<<?endl;??
- ??????
- ??????
- ????cout?<<?"q的值:"?<<?q?<<?"??aa的地址:"?<<?&aa?<<?endl;??
- ??????
- ????cout?<<?"q[i]的地址:"?<<?endl;??
- ????for(i?=?0;?i?<?4;?++i)??
- ????cout?<<?q[i]?<<?endl;//q[0]?與?q的值相同???
- ??????
- ????cout?<<?"q指向int[4]的所有值:"?<<?endl;??
- ????for(i?=?0;?i?<?4;?i++)??
- ????cout?<<?q[0][i]?<<?'?';??
- ????cout?<<?endl;??
- ????//cout<<*(p[0])<<*(q[0])<<endl;??
- ????return?0;???
- }???
?運行結果:
p的值:0x22ff60
p[0]的值:0x22ff5c? a的地址:0x22ff5c
p[0]地址保存的值:1? a的值:1
p[1]地址保存的值:2? b的值:2
p[2]地址保存的值:3? c的值:3
p[3]地址保存的值:4? d的值:4
q的值:0x22ff30? aa的地址:0x22ff30
q[i]的地址:
0x22ff30
0x22ff40
0x22ff50
0x22ff60
q指向int[4]的所有值:
5 6 7 8
?
以下為網友的解釋,可能闡述得更為細致。
?
?優先級: ?[]? >?*
定義涉及兩個運算符:“*”(間接引用)、“[]”(下標),“[]”的優先級別大于“*”的優先級別。
?
?
請看以下定義:
int a[2][4]={{2,5,6,8},{22,55,66,88}};
int c[4]={5,8,9,4};
int d[3]={23,12,443};
int *p[4],(*q)[4];
q=a;
*p=c;
*(p+1)=d;
則int *p[4]和int (*q)[4]的存儲數據為:
驗證:
?
? |
?
?
#include <stdio.h> int main(void) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? 輸出結果為: *(*(p+0)+0)=5 *(*(p+0)+1)=8 *(*(p+0)+2)=9 *(*(p+0)+3)=4 *(*(p+1)+0)=23 *(*(p+1)+1)=12 *(*(p+1)+2)=443 =============== *(*(q+0)+0)=2 *(*(q+0)+1)=5 *(*(q+0)+2)=6 *(*(q+0)+3)=8 *(*(q+1)+0)=22 *(*(q+1)+1)=55 *(*(q+1)+2)=66 *(*(q+1)+3)=88 |