设为首页 加入收藏

TOP

C++逆天语法系列之二维数组
2015-07-20 17:27:02 来源: 作者: 【 】 浏览:3
Tags:语法 系列 二维数

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


	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列地址


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 4756 Install Air Conditioni.. 下一篇1410142236-ny-寻找最大数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)