请教 2维数组 地址传递问题???

[复制链接]
 楼主| avocationA 发表于 2009-3-16 10:42 | 显示全部楼层 |阅读模式
const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;A[3][26]=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建参数存储区_设定初始值<br />{<br />//&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;&nbsp;<br />&nbsp;&nbsp;{1,2,3,4,3,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,},//位数<br />&nbsp;&nbsp;{0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},//号<br />&nbsp;&nbsp;{1,2,3,4,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},//单位<br /><br />};<br />const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;B[3][26]=<br />{<br />//&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;&nbsp;<br />&nbsp;&nbsp;{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,},//位数<br />&nbsp;&nbsp;{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},//号<br />&nbsp;&nbsp;{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},//单位<br />};<br />请教&nbsp;2维数组&nbsp;地址传递问题???<br /><br />/***************************<br />【函数】:MenuDown()<br />【功能】:右移<br />【参数】:无<br />***************************/<br />void&nbsp;MenuDown(unsigned&nbsp;char&nbsp;数组地址变量&nbsp;unsigned&nbsp;char&nbsp;MenuY)<br />{&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;DATA_1=*(*(A+0)+MenuY);////小数点<br />&nbsp;&nbsp;DATA_2=*(*(A+1)+MenuY);//正负号&nbsp;<br />&nbsp;&nbsp;DATA_3=*(*(A+2)+MenuY);//显示单位&nbsp;<br />}<br /><br />请教我想通过参数传递把&nbsp;&nbsp;&nbsp;上面的A地址&nbsp;&nbsp;&nbsp;变成B地址&nbsp;&nbsp;&nbsp;怎么操作
纯金属 发表于 2009-3-16 15:56 | 显示全部楼层

没有看懂楼主的问题

  
biao.l 发表于 2009-3-16 17:46 | 显示全部楼层

函数参数定义一个指针P

把P代替函数中的A,就可以通过函数调用把A,B的地址传给P了.
 楼主| avocationA 发表于 2009-3-17 06:29 | 显示全部楼层

谢谢 楼上!

  
HWM 发表于 2009-3-17 09:30 | 显示全部楼层

别把数组看成一个“类型”

  
林粼粼 发表于 2009-3-17 09:40 | 显示全部楼层

unsigned char **PP

  
xwj 发表于 2009-3-17 09:58 | 显示全部楼层

唉,你到底想干什么?

<font color=#555555>//调试试函数------------------------------------------<br />void&nbsp;test(unsigned&nbsp;char&nbsp;*PP)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;LedDat.ShowRadix&nbsp;=*(*(PP+0)+1);//显示位数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;LedDat.ShowRadix&nbsp;=*(*(PP+1)+1);//小数点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />MMain()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;MenuEnter_P();&nbsp;//正确&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;test(A);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//错误!!!!!!!!????&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />}<br /></font><br /><br />是要把A的地址传递进test()?&nbsp;<br />LedDat.ShowRadix&nbsp;是单字节变量??<br />LedDat.ShowRadix&nbsp;为A[0][0]&nbsp;再+1???(为什么还要加个1?)<br /><br />那这样写啊:<br />void&nbsp;test(unsigned&nbsp;char&nbsp;*PP)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;LedDat.ShowRadix&nbsp;=*PP&nbsp;&nbsp;+1;//显示位数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;PP++;<br />&nbsp;&nbsp;LedDat.ShowRadix&nbsp;=*PP&nbsp;&nbsp;+1;//小数点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br /><br />随时谨记:<br />指针的声明是unsigned&nbsp;char&nbsp;*PP;(有星号就是声明的指针类型!)放在函数参数里的话也是一样,只是最后一个不要“;”号;<br /><br />指针的赋值是:PP=地址;&nbsp;没有星号!,地址也没有星号!;<br /><br />指针内容的取出:&nbsp;*PP或*(指针运算表达式),有星号!&nbsp;“*&nbsp;”和字符是紧耦合,所以指针要运算后再取出值的话指针表达式要加括号。<br /><br /><br /><br />唉,都是C语言的基本常识,其实很简单的;<br />如果LZ还觉得虽然有点绕,甚至绕不清的话,建议LZ先去看书!!!<br />也就几页纸的内容。
 楼主| avocationA 发表于 2009-3-17 10:03 | 显示全部楼层

粘贴 错了!!

&nbsp;&nbsp;&nbsp;LedDat.ShowBit&nbsp;=*(*(A+0)+1);//显示<br />&nbsp;&nbsp;LedDat.ShowRadix&nbsp;=*(*(A+1)+1);//小数
 楼主| avocationA 发表于 2009-3-17 10:07 | 显示全部楼层

为了让 人 更好理解 所以就把MenuPlace 变1

LedDat.ShowRadix&nbsp;为A[0][0]&nbsp;再+1???(为什么还要加个1?)<br /><br />---------------------------------------------------------<br />&nbsp;&nbsp;LedDat.ShowBit&nbsp;=*(*(P00+0)+MenuPlace);//显示位数<br />&nbsp;&nbsp;LedDat.ShowRadix&nbsp;=*(*(P00+1)+MenuPlace);//小数点<br />&nbsp;&nbsp;LedDat.ShowSign_P=*(*(P00+2)+MenuPlace);//正负号&nbsp;<br />&nbsp;&nbsp;LedDat.ShowUnit&nbsp;&nbsp;=*(*(P00+3)+MenuPlace);//显示单位<br /><br />加1是X方向移动&gt&gt&gt&gt<br />*(P00+0)<br />*(P00+1)<br />*(P00+2)<br />是Y方向移动&nbsp;&nbsp;
 楼主| avocationA 发表于 2009-3-17 10:08 | 显示全部楼层

xwj 是我没有说清楚 谢谢指教

  
HWM 发表于 2009-3-17 10:11 | 显示全部楼层

转本人的一个老贴

其中内容未列入随笔,在此帖出以供参考<br /><br /><br />数组实际上是一个由分层次叠加构造而成的一种数据结构,其最底层的基础就是下标操作符。作为一种操作符不仅可以和数组联用,还可以通过重载改变其原始语义(具体可见新手版内&nbsp;C++&nbsp;随笔-21)。<br /><br />只要有了一个常量指针,配合下标操作符的使用,就可以形成一个数组的雏形(前提是具备一个以常量指针为起始点的存储空间)。当然作为数组的雏形自然有其缺陷,那就是缺少数组的长度信息,以至于不可能得到其有效的整体特性。因此作为一个“完整”的数组定义还必须加入数组的长度信息。但作为一维数组,相关定义并未改变其“数组名”和下标操作符的基本属性。<br /><br />那么多维数组情形又将是如何的呢?显然由于多维数组必须含有n-1维下标长度的信息(n&gt1),所以不可能存在上述数组的原始实现(仅用起始指针和下标)。那么多维数组具体又是如何定义的呢?先列出定义形式:<br /><br />type&nbsp;A[N1][N2]...[Nn];<br /><br />其中n为数组的维数,N1...Nn为数组各维的长度。<br /><br />类似的,若将A独立拿出来看,它还是一个指向数组起始位置的常量指针。问题是在此情况下所指对象的“类型”是什么?是否还能象一维数组那样所指类型为数组单元变量类型呢?显然不行,因为这样的话将失去多维数组中相当重要的长度信息。那么不指向数组单元变量又指向什么呢?答案是,A将被定义为指向“数组类型”type&nbsp;[N2]...[Nn]的指针。由此,实际上还可以得出这样一个结论,数组A是被组织成N1个类型为type&nbsp;[N2]...[Nn]的单元的“一维数组”,其中*(A+i)为此“一维数组”的第i+1个单元(即i+1个数组的数组名)。以此类推,可以得到这样一个表达式:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*(...*(*(A+i)+j)+...k)&nbsp;&lt=&gt&nbsp;A[j]...[k]<br /><br />利用这种层次叠加构造法,顺理成章地建立了从最原始的数组雏形,通过不断地增加维长信息,最终到多维数组空间的形成机制。<br /><br />下面列出一个具体的实例:<br /><br />#include&nbsp;&quot;stdafx.h&quot;<br /><br />int&nbsp;A[10][20][30];<br />int&nbsp;x,&nbsp;y;<br /><br />int&nbsp;main(int&nbsp;argc,&nbsp;char*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;A[1][2][3]&nbsp;=&nbsp;1234;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(*(*(A+3)+2)+1)&nbsp;=&nbsp;4321;<br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;*(*(*(A+1)+2)+3);<br />&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;A[3][2][1];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />
xwj 发表于 2009-3-17 10:21 | 显示全部楼层

如果是要取出多维数组中的值,应该这样:

还是按字节来定义指针,即:<br />void&nbsp;test(unsigned&nbsp;char&nbsp;*PP)<br />{<br />}<br />这时,PP每加1就指向下一个字节,也就是按线性寻址。<br /><br />对于多维数组,A[x][y]的位置其实就是A[0][0]再加上&nbsp;x*下层就宽度(26)+y,<br />其实从下面数组赋初值的规律也可以看出:一个一个排列,从A[0][0]开始排满26个就到了A[1][0]:<br /><br />const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;A[3][26]=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建参数存储区_设定初始值<br />{<br />//&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;&nbsp;<br />&nbsp;&nbsp;{1,2,3,4,3,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,},//位数<br />&nbsp;&nbsp;{0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},//号<br />&nbsp;&nbsp;{1,2,3,4,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},//单位<br /><br />};<br />&nbsp;<br /><br />然后赋值时可以用:<br />test(A);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//--这时A实际上就是A[0][0]<br /><br />又或者这样赋值:<br />test(&A[x][y]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//--这时传入指向A[x][y]的指针<br /><br /><br />还可以这样赋值:<br />test(A&nbsp;+&nbsp;x*26&nbsp;+y]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//--这时传入指向A[x][y]的指针<br /><br />甚至可以这样写:<br />还可以这样赋值:<br />test(&A[0][0]&nbsp;+&nbsp;x*26&nbsp;+y]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//--这时传入指向A[x][y]的指针<br /><br />注意:<br />&A[0][0]&nbsp;&nbsp;&nbsp;实际上就是A<br />A代表的是&A[0][0]位置的指针,因为A是数组名,<br />A[0][0]代表的却是这个位置的内容,要获得该位置的指针必须的加上取指针符号“&”!<br /><br /><br />总之:<br />&nbsp;&nbsp;&nbsp;&nbsp;一定要明白数组地址和&nbsp;地址内元素的关系和区别,不要搞混了;<br />&nbsp;&nbsp;&nbsp;&nbsp;指针变量永远只准过地址,指针永远只可能是地址加纯数字,当你把它变成了纯数字或者多个指针相加之类的而又没有强制转换,那就肯定是你搞错了,这是个大大的<h1>BUG!</h1><br />&nbsp;&nbsp;&nbsp;
xwj 发表于 2009-3-17 10:59 | 显示全部楼层

是的,理解多维数组先得理解多维数组实际上是多层堆叠再

实际上不管多少维度,都是相对于第一个(首地址、数组地址)的下标偏移,<br />而数组不管是多少维的,都是一段线性(一维)的连续存储空间。<br /><br />多维数组是这样排列的:<br />一维:<br />A[MaxX]:&nbsp;&nbsp;A[0],A[1],A[2],A[..],A[MaxX-2],A[MaxX-1],&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//注意,由于下标从0开始,最大只能是总尺寸-1;<br />一维对应空间当然就是收地址开始连续MaxX个单元了,所以按*(p+x)也可以取到正确位置的值;<br /><br />二维,其实就是多组一维叠起来:<br />A[MaxY][MaxX]:<br />&nbsp;&nbsp;A[0][0],A[0][1],A[0][2],A[0][..],A[0][MaxX-2],A[0][MaxX-1],&nbsp;<br /><font color=#DD0000>&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MaxX-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MaxX-1&nbsp;</font><br />&nbsp;&nbsp;A[1][0],A[1][1],A[1][2],A[1][..],A[1][MaxX-2],A[1][MaxX-1],&nbsp;<br /><font color=#DD0000>&nbsp;&nbsp;MaxX+0&nbsp;&nbsp;MaxX+01&nbsp;&nbsp;MaxX+1&nbsp;MaxX+...&nbsp;MaxX+MaxX-2&nbsp;&nbsp;MaxX+MaxX-1</font><br />&nbsp;&nbsp;....<br />&nbsp;&nbsp;A[MaxY-2][0],A[MaxY-2][1],A[MaxY-2][2],A[MaxY-2][..],A[MaxY-2][MaxX-2],A[MaxY-2][MaxX-1],&nbsp;<br /><br />&nbsp;&nbsp;A[MaxY-1][0],A[MaxY-1][1],A[MaxY-1][2],A[MaxY-1][..],A[MaxY-1][MaxX-2],A[MaxY-1][MaxX-1],&nbsp;<br /><font color=#DD0000>&nbsp;&nbsp;MaxX*(MaxY-1)+0,MaxX*(MaxY-1)+1.....&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MaxX*(MaxY-1)+(MaxX-1)也就是MaxX*MaxY-1</font><br />&nbsp;&nbsp;整个数组有MaxX*MaxY个元素,一维下标从0一致排到MaxX*MaxY-1<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//注意,同样的,由于下标从0开始,所以MaxY最大只能是总尺寸MaxY-1;<br /><br /><br />而三维数组,同样就是多组二维数组叠起来,MaxX*MaxY*MaxZ个元素,一维下标从0一致排到MaxX*MaxY+MaxZ-1,自己去类推即可。<br /><br /><br />存储器空间都是线性编址的,空间坐标、维度转换是最基本的加法和乘法罢了(显示器的时间坐标变换也是一样),<br />这真的很基本也很简单啊,只要智力没问题,肯定能够自己想明白的:-)<br /><br /><br /><br />PS:<br />跑题了,LZ的问题只是在于没搞清楚到底给指针赋了什么类型的值,和怎么取出对应层次的指针的问题。<br /><br />其实,指针,你声明时是一维的,那不管它指向多少维的数组,它还是一维的!!!<br />
 楼主| avocationA 发表于 2009-3-17 11:31 | 显示全部楼层

TO

每个2维数组代表一组数据的属性&nbsp;&nbsp;&nbsp;他们的y相同&nbsp;&nbsp;但是x不同(2维数组值是常量)<br />&nbsp;&nbsp;<br />本想用3维数组&nbsp;但是那样的话太占空间因为&nbsp;&nbsp;每个2维数组(每组数据)的长度相差太大<br /><br />所以我就用&nbsp;N(N&gt100)个2维数组&nbsp;&nbsp;,〈以后可能还要加&nbsp;多组数据〉<br /><br />通过test(?)&nbsp;传递&nbsp;每个2维数组&nbsp;的首地址&nbsp;来切换组&nbsp;!<br /><br /><br /><br /><br />const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;A[5][10]=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />........................<br />};<br /><br />const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;B[5][20]=<br />{<br />..................<br />};<br /><br /><br />const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;C[5][60]=<br />{<br />..................<br />};<br /><br />const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;E[5][60]=<br />{<br />..................<br />};<br /><br />const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;F[5][90]=<br />{<br />..................<br />};<br /><br />我的MCU是16位<br />他的地址因该也是16位<br /><br />所以unsigned&nbsp;char&nbsp;**PP&nbsp;&nbsp;是否因改成&nbsp;unsigned&nbsp;short&nbsp;**PP<br /><br />void&nbsp;test(unsigned&nbsp;char&nbsp;**PP)<br />{<br />}<br />----------------------------------------------------------<br />还是按字节来定义指针,即:&nbsp;&nbsp;|、&nbsp;&nbsp;可能不符合我的这个思路!!<br />void&nbsp;test(unsigned&nbsp;char&nbsp;*PP)|<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />}--------------------------------------------------------<br /><br /><br /><br /><br /><br /><br />
 楼主| avocationA 发表于 2009-3-17 12:14 | 显示全部楼层

我只把A当成存地址的变量

我只把A当成存地址的变量<br />然后想办法用B里的地址传过去.<br />-----------------------------------------------<br /><br />
 楼主| avocationA 发表于 2009-3-17 12:14 | 显示全部楼层

U char *A

U&nbsp;char&nbsp;&nbsp;*A<br /><br />51的&nbsp;@A==*A
xwj 发表于 2009-3-17 16:30 | 显示全部楼层

LZ,关于指向指针的指针,可以去看我以前发的那个T9拼音示

如果是准备用数组来存储指针,规范的做法是直接定义个指针数组,而不应该用一大堆的强制转换。<br /><br />当然,你非要用强制转换也未尝不可,但再怎么说也的把它写完整啊!!!
 楼主| avocationA 发表于 2009-3-17 18:08 | 显示全部楼层

恩复习下C 不行俺就用苯的方法解决.

或者一个参数用一个结构体.链表解决<br />2级指针&nbsp;初次使用&nbsp;有点晕<br />
 楼主| avocationA 发表于 2009-3-18 08:20 | 显示全部楼层

const static 报错 转不过来

const&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;P09[5][P00_Extent]=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建菜单属性存储区<br />{<br />//&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;8&nbsp;9&nbsp;0&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;<br />&nbsp;&nbsp;{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,},//显示位数&nbsp;<br />&nbsp;&nbsp;{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}//最小<br />};<br /><br />void&nbsp;Menu_P(unsigned&nbsp;char&nbsp;(*P0X)[26])<br />{<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;LedDat.ShowBit&nbsp;&nbsp;&nbsp;=*(*(P0X+0)+MenuPlace);//显示位数<br />&nbsp;&nbsp;LedDat.ShowRadix&nbsp;=*(*(P0X+1)+MenuPlace);//小数点<br />}<br /><br /><br />void&nbsp;Menu(void)<br />{<br />//int*p=&ver[0][0];<br />//int**pp=&p;<br />&nbsp;&nbsp;Menu_P(P09);<br />&nbsp;&nbsp;MenuMode();<br />&nbsp;&nbsp;<br /><br />}
 楼主| avocationA 发表于 2009-3-18 15:56 | 显示全部楼层

OK 了NND 是__pmem (编译环境问题)自己C也不牢靠

__pmem&nbsp;unsigned&nbsp;char&nbsp;P00[5][P00_Extent]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

123

主题

935

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部