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

时间: 2024-12-14 04:15:33

C++逆天语法系列之二维数组的相关文章

【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在数据类型的后面,也可以在数组名称的后面,其它的依次类推. 例如: int[][] map; char c[][]; 和一维数组一样,数组声明以后在内存中没有分配具体的存储空间,也没有设定数组的长度.  -------------------------------------------------

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

剑指offer系列源码--二维数组中的查找

题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:14827 解决:2888 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2

面试题03_二维数组中查找_剑指offer系列

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路: 这是一道考查二维数组的理解和编程能力的题. 在二维数组在内存中是连续存储的.在内存中从上到下存储各行元素,在同一行中按照从左到右存储. 因此可以按照行号和列号来计算出相对数组首部的位置. 由于每一行 和 每一列都是有序的,因此,我们可以拿要查找的数与数组的右上角的数进行比较. 因为每一行从左到右递增,每一列

小白C#窗体系列-02.二维码生成器

今天是情人节,咳,男人们带着他们的男朋友们,女人带着她们的女朋友们愉快的逛着街.逆天也就不随大众了,就继续出C#小白系列的教程了~~~ 实在没空去录教程了,就看看文档吧,大家都知道的,录教程是比较花时间的,我不想草草了事,那是对大家和我自己的不负责,视频可以以后再录,不过软件和源码以及文档得先弄好,毕竟逆天不喜欢失信与自己~~ 废话不说了,开始我们的教程吧~ 软件下载(.NET 4.0 框架)http://pan.baidu.com/s/1i3BUVNv[源码看下面] 一.设计图纸: 二.代码分

二维数组的最大子数组之和

一.设计思路:与求一维数组的最大子数组类似,将二维数组转化为一维数组来计算,也是通过遍历的方式将一个子矩阵与上几个子矩阵相加如果小于0则舍去这个子矩阵,按此方法计算从这个子矩阵以后的矩阵,求得遍历中最大值,即为最大子数组之和. 二.代码: package soft_third_test; public class test { static int maxSum(int p[][],int startLine,int endLine,int n){ int ans=p[endLine][1]-p

第二十一节(数组概要, 一维、二维数组的声明和使用,数组的排序,数组的查找,)

一维数组:1:/* 数组: 1. 数组是一种引用类型 2. 数组是一种简单的数据结构,线性的机构 3. 数组是一个容器,可以用来存储其他元素, 4. 数组也是可以存储任意数据类型的元素 5. 数组分为: 一维数组,二维数组,三维数组,多维数组 6. 数组中的存储的元素类型 是统一的 7. 数组的长度是不可变的,数组一旦创建长度就是不可变的,固定的 声明数组语法: <1>. 数组元素的类型[] 变量名称 <2>. 数组元素的类型 变量名称[] */ public class Arra

图像转换为二维数组存入DSP6748

 本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 这篇博客主要是要讲怎么把一张图片存成一个二进制的文件,直接存到DSP中来做处理,而不用考虑DSP与图像采集模块,或者上位机之间的数据通信使得我们更加专注于算法的开发研究和处理功能的实现. 这是最近在做的一样工作,主要开发对雷达图像处理的目标检测算法.思路是先把现成的雷达图片转化为一个数组,然后以头文件的