按键精灵怎么理解二维数组?
一维数组就理解成excel中的一行数据,有n个;二维数组就是一张excel表,有m行,n列;3维数组就是一个excel文件,有i张表,每张表有m行,n列。
依次类推即可。
MATLAB里面的二维数组元素怎么表示?
a类型是属于type *(type是你事先给a定义的类型)的,即type型指针。所以a的值是一个内存地址。
若a是一维数组,则a指向的是第一个元素。
若a是二维数组,也可以将a看成一个一维数组,那么其元素是其行向量。例如{{2,2},{3,4}}。
既然a又看成一维数组,那么*a即是其第一个“元素”——其第一行。而第一行亦是一个数组,所以*a是第一行这个数组的指针。
那么,**a即第一行的第一个元素a[0][0],而*(*a+1)则是第一行的第二个元素a[0][1]。下面的例子中,说明a与*a的值相同,但是需要注意的是地址相同,也并不意味着他们的指向的地方相同。
事实不仿试一下a+1与*a+1,会发现二者并不相等。
正是因为其意义不同。正是其意义的不同,所以可以通过地址运算,表示出相应位置的元素,比如说*(*(a+1)+1),表示的就是a[1][1]。
若a是高维的,其本质还是数组的嵌套,所以根据上面的方法易得出。下面这个例子正是一个很好的说明吧。
(其实我是看到这里才明白是怎么回事的。)
二维数组a0表示什么?
二维数组a0表示:
a[0] 的类型是 int [],也就是说 a[0] 是一个一维数组的首地址,在这里,被 a[0] 代表的一维数组就是:a[0][0]、a[0][1]、a[0][2]。
当需要用指针变量指向 a 和 a[0] 时,由于类型不同,指针变量的类型也需要随之改变。
a就是数组的首地址,a[0]是第一行第一个元素的首地址,也即是a的首地址,&a[0]是第一行的首地址。
a[0][0]就是取第一行第一个元素的值,也即是1。
C语言二维数组,怎么理解?
相信题主应该明白 C 语言中基本数据类型的变量,例如定义一个 float 型变量:
float a = 3.14;
变量 a 能表示一个数值,但是现实生活中,仅仅使用一个单数值常常是不能完成任务的。更多情况下,需要解决的问题数据类型都是比较复杂的。
一维数组
小明班级有 40 名同学,现在考试成绩出来了,要求我们使用 C 语言把它们的成绩从高到低排出来。要用 C 语言解决这个问题,首先要用 C 语言把 40 名同学的成绩表示出来。但是总不可能定义 40 个变量来存储各位同学的成绩吧?
好在 C 语言提供了数组语法,我们定义一个 score 数组用于解决这个问题是非常合适的:
float score[40];
score 有 40 个元素,可以表示 40 个同学的成绩。C 语言在内存中开辟一块连续的内存,供 score 使用,这块内存的大小等于 40*sizeof(float) 字节。
二维数组
要是现实生活中,所有问题都这么简单就好了,那我只要利用 C 语言的一维数组,就能走遍天下都不怕了。但是事与愿违,哪怕只是一个 9 宫格,一维数组已经不方便描述它了。
难道要定义 3 个一维数组来描述这个 9 宫格?就算可以,要是这个表再大点呢?比如 1000行,1000列呢?更进一步的,要是希望我们使用 C 语言描述笛卡尔二维坐标系,使用一维数组岂不是麻烦死了?
二维坐标系里的坐标怎样表示方便呢?数学中的表示方法就不错,横坐标为 a,纵坐标为 b 的点,写作(a, b)。
为了表述方便,使用 P 表示 9 宫格。如果在 P 中画上坐标轴,那每个格子描述起来就方便了,P(0,0) = 0, P(0,1) = 1,...
那要是 C 语言也能这么用,表示9宫格就太方便了,对不?实际上,还真可以。请看:
float pos[9][9];
pos[0][0]=0;
pos[0][1]=1;
几乎与用坐标描述一模一样,这可比用一维数组描述方便多了。类似的,三维数组,四维数组,都有适合使用它们的时候,理解方法也同二维数组相似。
二维数组的内存分配
对于人类来说方便的,死板的计算机不一定也这么认为。实际上,C 语言希望“规则”越少越好,它不怕麻烦,就怕“灵活”。
C语言对内存的分配方式,可不会随着人类认为的“维度”变化而变化。它就一种分配内存的方式,不管你是几维数组,分配内存统一按照线性划分。
对于 P[1][2],C语言会将其解释为 P[1*3+2]。计算机最恨的就是“动脑”了,能用一维解决,就绝对不用二维。
而我们人类,最喜欢的就是,怎样方便怎样来。这也算是人与机器的区别吧。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。