C多维数组指针

int zippo[4][2]

1、zippo[0]是一个占用一个int大小对象的地址,而zippo是占用2个int大小对象的地址。由于这个整数和内含2个整数的数组都开始于一个地址,所以zippo和zippo的值相同。
2、给指针加1,会增加对应类型大小的数值。zippo和zippo[0]不同。
zippo+1指向的对象占用了2个int大小,
zippo[0]指向的对象占用了1个int大小。
3、解引用一个指针(*)或数组名后使用带下标的[]运算符,得到引用对象的值。
zippo是地址,必须解引用2次才能获得原始值。地址的地址或指针的指针就是双层间接。

int zippo[4][2] ={{2,4},{6,8},{1,3},{5,7}};
/*
zippo=		0x0064fd38
zippo+1=	0x0064fd40,跨2个int
zippo[0]=	0x0064fd38
zippo[0]+1=	0x0064fd3c,跨1个int
*zippo=		0x0064fd38,对二维数组指针解引用,得到的值是一维数组指针
*zippo+1=	0x0064fd3c,对一维数组指针加1,得到的是一维数组下一个值的指针

	zippo[0][0]=2
	  *zippo[0]=2
		**zippo=2
	zippo[2][1]=3
*(*(zippo+2)+1)=3
*/

4、*(*(zippo+2)+1)详细解释

/*
zippo			←二维数组首元素的地址(每个元素都是内含两个int类型元素的一维数组)
zippo+2			←二维数组的第3个元素(即一维数组)的地址
*(zippo+2)		←二维数组的第3个元素(即一维数组)的首元素(一个int类型的值)地址
*(zippo+2)+1	←二维数组的第3个元素(即一维数组)的第2个元素(一个int类型的值)地址
*(*(zippo+2)+1)	←二维数组的第3个一维数组元素的第2个int类型元素的值,即数组第3行第2列的值(zippo[2][1])
*/

5、声明一个指针变量pz指向一个二维数组(如pizzo)

int (* pz)[2];//正确。pz指向一个内含两个int类型值的数组[]优先级大于()
int * pax[2];//不正确。pax是一个内含两个指针元素的数组,每个元素都是指向int的指针
int zippo[4][2] ={{2,4},{6,8},{1,3},{5,7}};
int (* pz)[2];
pz=zippo;
/*
zippo=		0x0064fd38
zippo+1=	0x0064fd40,跨2个int
zippo[0]=	0x0064fd38
zippo[0]+1=	0x0064fd3c,跨1个int
*zippo=		0x0064fd38,对二维数组指针解引用,得到的值是一维数组指针
*zippo+1=	0x0064fd3c,对一维数组指针加1,得到的是一维数组下一个值的指针

	zippo[0][0]=2
	  *zippo[0]=2
		**zippo=2
	zippo[2][1]=3
*(*(zippo+2)+1)=3
*/

你可能感兴趣的:(C,c)