C++多維數組


一、多維數組其本質是數組的數組。

  int a[3][4];  //大小為3的數組,里面的元素是含有4個元素的數組

  int a1[3][4][5];  //大小為3的數組,它的每個元素都是大小為4的數組,這些數組里面的元素是含有5個整數的數組

  面試題:

       int a[4][5],(*p)[5];

       p = a;

       下面哪個選項表示a數組中的元素?

       A.  p+1

       B.  * (p+3)

       C.  * (p+1)+3

       D.  * (* p+2)

  分析:p是一個指針,指向一個一維數組,里面有5個int類型的元素

    a可以理解成一個一維數組,里面的元素為a0,a1,a2,a3

    a1還是一個一維數組,里面的元素為a10,a11,a12,a13,a14

#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
	int a[4][5], (*p)[5];
	p = a;

	cout << p << endl;//輸出007FFC18
	cout << p + 1 << endl;//輸出007FFC2C,相差20
	cout << p + 2 << endl;//輸出007FFC40,同樣相差20
	return 0;
}

    根據指針的加減法,對照以上代碼及輸出,不難理解,p = a后,

    p是指針,指向a的第一個元素,a0,

    所以*p相當於解引用了,表示a0這個對象,

    而a0這個對象也是一個數組,把它理解成數組名,它就是a0第一個元素的地址,

    即*p表示指針,指向a00,

    再解引用*(*p)就是a00這個對象了。

 

    這里有點繞,更加麻煩的是這里指針的加減法每次加減的字節數發生了變化,

    p直接加減時,每次增加的字節數是20,相當於a0所占的內存,

    *p加減時,每次增加的字節數是4,相當於a00所占的內存,

    原因:判斷每次增加的字節數前,要先判斷這個指針所代表的的含義。

     

    所以ABC選項很好排除

    D選項 * (* p+2),p表示數組a(數組a內第一個元素a0的地址),

          * p表示數組a0(數組a0內第一個元素a00的地址),

          * p+2表示a02的地址,所以* (* p+2)表示a[0][2]。

          驗證如下:

#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
	int a[4][5] = { 0, 0, 1, 0, 0,
		0, 0, 0, 0, 0,
		0, 0, 0, 0, 0,
		0, 0, 0, 0, 0 };
	int(*p)[5];
	p = a;


	cout << *(*p + 2) << endl;//輸出1
	return 0;
}


免責聲明!

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



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