C++逆天语法系列之二维数组

某公司的笔试题,自己分析得出的答案,并在后面对二维数组元素表示形式做出总结。新手朋友别嫌啰嗦,耐心看完并记住对你会有帮助的。老鸟们也欢迎来提意见。


	int a[4][4] = {
		{1,2,3,4},
		{50,60,70,80},
		{900,1000,1100,1200},
		{13000,14000,15000,16000}
	};
	int (*p1)[4] = a;
	int (*p2)[4] = &a[0];
	int *p3 = &a[0][0];

	printf("%d, %d, %d, %d\n",
		*(*(a+1)-1),
		*(*(p1+3)-2)+1,
		*(*(p2-1)+16)+2,
		*(p3+sizeof(p1)-3)
		);

64位环境,问上述代码的运行结果。


好吧来分析,首先二维数组名指向的是二维数组的首行地址,

int(*p1)[4]=a,是一个指向四个整型数组的指针;

int *p3=&a[0][0],将二维数组按一维数组的方式引用;

第一个输出:a+1即第二行的地址,*(a+1)即第二行的第一个元素的地址,再减一是它前面的元素地址,即第一行第四个元素,结果为4.

第二个输出:p1和p2和a是一样的,p1+3即第四行的地址,*(p1+3)即第四行第一个元素的地址,再减二则是第三行第三个元素的地址,结果为1101。

第三个输出:p2-1为第四行地址,*(p2-1)表示第四行第一个元素地址,加上16即绕一圈还是这个元素,结果为13002。

第四个输出:64位环境,则sizeof(p1)是8,p3+5表示一维数组第五个元素,即二维数组第二行第二个元素,结果为60。


嗯来做个总结吧:

二维数组元素a[i][j]有下面几种引用形式:

*(a[i]+j) //a[i]为数组第i行地址,再加j即为数组第i行j列地址

*(*(a+i)+j) //a+i为数组第i行地址,*(a+i)为数组第i行0列地址,再加j即为第i行j列地址


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。