(1)指針數組本質上是一個數組,指針是數組中的內容,表示數組中的每一個元素都是指針,所以指針數組就是存放指針的數組。下面是指針數組的用法:面試
1 int a = 10, b = 20; 2 int *p[3]; 3 p[0] = &a; 4 p[2] = &b;
(2)指針數組的定義能夠抽象爲:指向變量類型 * 數組名稱[數組長度]。數組
(3)[]的優先級高於*,因此[]與p先結合,說明p是一個數組,長度爲3,其數組元素的類型是int *。spa
(1)數組指針本質上是一個指針,數組是指針指向的類型,表示指針指向一個數組,所以數組指針就是指向數組的指針。下面是數組指針的用法:指針
1 int a[3] = { 1,2,3 }; 2 int (*p)[3]; 3 p = &a;
(2)數組指針的定義能夠抽象爲:數組元素類型 (* 指針名稱)[數組長度]。code
(3)()使得*與p先結合,因此p是一個指針,蓋掉(*p)剩下的就是指針指向的內容了即int[3]。blog
(4)數組指針指向整個數組a(取地址&a),而非數組a的首元素(取地址a),雖然數組a和數組a中首元素的地址相同。get
請寫出下面程序的輸出結果(假設數組a的地址&a爲0x001DF720)class
1 int main(int argc, char *argv[]) { 2 //數組指針和二維數組的區別 3 int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} }; 4 int(*p)[5] = a; 5 cout << p << endl; 6 cout << p + 1 << endl; 7 8 cout << *p << endl; 9 cout << *(p + 1) << endl; 10 cout << *p + 1 << endl; 11 12 cout << **p << endl; 13 cout << **(p + 1) << endl; 14 cout << *(*p + 1) << endl; 15 16 getchar(); 17 return 0; 18 }
知識點提示:(1)數組名始終等價於數組首元素的地址:a<=>&a[0]。變量
(2)解引用的次數等於數組的維度時,才能獲得數組的元素值,如二維數組必須通過兩次解引用才能獲得數組的元素值。引用
(3)數組首元素地址和數組的地址雖然位置同樣,可是兩者徹底不是一回事(經過解引用來理解),數組首元素地址&a[0]解引用以後爲*(&a[0])=a[0],是首元素的值;而數組地址&a解引用以後爲*(&a)=a=&a[0];經過以上說明,數組地址一次解引用以後獲得數組首元素的地址,再解引用以後獲得首元素的值(在一維數組的狀況下)。
(4)二維數組a[n][m],能夠把a[n]當作是內層[m]的數組名。
按照以上的知識和規則認真分析能夠得出以下答案:
1 //數組a的地址&a爲0x001DF720 2 int main(int argc, char *argv[]) { 3 int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} }; 4 int(*p)[5] = a;//a==&a[0],左右類型相同,p指向一個元素爲5的一維數組 5 cout << p << endl;//兩次解引用是地址,p=&a[0],0x001DF720 6 cout << p + 1 << endl;//兩次解引用是地址,p+1=&a[1]=0x001DF720+4*5=0x001DF734 7 8 cout << *p << endl;//一次解引用是地址,*p=a[0]=&a[0][0],0x001DF720 9 cout << *(p + 1) << endl;//一次解引用是地址,*(p+1)=a[1]=&a[1][0],0x001DF734 10 cout << *p + 1 << endl;//一次解引用是地址,*p+1=&a[0][1]=0x001DF724 11 12 cout << **p << endl;//二次解引用是元素值,**p=a[0][0]=1 13 cout << **(p + 1) << endl;//二次解引用是元素值,**(p+1)=a[1][0]=6 14 cout << *(*p + 1) << endl;//二次解引用是元素值,*(*p+1)=a[0][1]=2 15 16 getchar(); 17 return 0; 18 }
指出下面程序中的錯誤:
1 int main(int argc, char *argv[]) { 2 int b[6] = { 1,2,3,4,5,6 }; 3 int *p = &b; //左右類型不匹配 4 cout << p << endl; 5 6 getchar(); 7 return 0; 8 }
知識點:數組首元素地址和數組的地址雖然位置同樣,可是兩者徹底不是一回事(經過解引用來理解),數組首元素地址&a[0]解引用以後爲*(&a[0])=a[0],是首元素的值;而數組地址&a解引用以後爲*(&a)=a=&a[0];經過以上說明,數組地址一次解引用以後獲得數組首元素的地址,再解引用以後獲得首元素的值(在一維數組的狀況下)。
修改方式如下二選其一:
1 //方式一 2 int (*p)[6]=&b; 3 //方式二 4 int *p=b;//或者:int *p=&b[0];
寫出指針數組str中四個指針元素的值。
因爲題目有問題,未正確解答,故略。