指針和引用(3)指針數組和數組指針


1.知識點

1.1指針數組——存放指針的數組

(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 *。

1.2數組指針——指向數組的指針

(1)數組指針本質上是一個指針,數組是指針指向的類型,表示指針指向一個數組,因此數組指針就是指向數組的指針。下面是數組指針的用法:

1 int a[3] = { 1,2,3 };
2 int (*p)[3];
3 p = &a;

(2)數組指針的定義可以抽象為:數組元素類型 (* 指針名稱)[數組長度]。

(3)()使得*與p先結合,所以p是一個指針,蓋掉(*p)剩下的就是指針指向的內容了即int[3]。

(4)數組指針指向整個數組a(取地址&a),而非數組a的首元素(取地址a),雖然數組a和數組a中首元素的地址相同。

2.面試題

2.1簡述數組指針與二維數組的區別

請寫出下面程序的輸出結果(假設數組a的地址&a為0x001DF720)

 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  }

2.2簡述數組地址和數組首地址的區別

指出下面程序中的錯誤:

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];

2.3簡述指針數組與指向指針的指針的區別

寫出指針數組str中四個指針元素的值。

由於題目有問題,未正確解答,故略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM