关于二维数组和指针的问题请教(清楚不清楚都进来看一下吧)
小D刚学C++不久,昨晚遇到了一个往函数传二维数组的问题,找了一下,发现了whg75 (风语) 的这个帖子:
http://search.csdn.net/Expert/topic/390/390177.xml?temp=.8505976
我认真看完了大虾们的讨论和解答,明白了不少,但又发现了一些问题
帖子最后公认的都是把二维数组当作一维数组来处理了,就是把数组名(本质上是二维指针但不是二维指针)强制转换成一维指针,然后在函数里边通过*(b+i*n+j)来等价于b[i][j]。
我想,因为一维数组名和一维指针是等价的,所以*(b+i*n+j)就等价于b[i*n+j]。
PPower(月亮光光,照地堂)说:
house(r,(float*)q,3); //這方法不安全,編譯器不會幫你檢查q是否合法,但執行會錯。
house(r,&q[0][0],3); //建議使用該方法調用。
我又想,既然&q[0][0]等于q[0],那么就可以这样调用了:
house(r,q[0],3);
编译、运行都没有任何问题
也就是说,函数中的一维数组元素b[i*n+j]经过被调用后被替换成了q[0][i*n+j],而且它与q[i][j]是完全等价的。
请问:
1. 是否真的可以认为在二维数组a[m][n]中,a[0][i*n+j]和a[i][j]是完全等价、可以互换的呢?使用a[0][i*n+j]是否符合规范,这样有什么安全隐患吗?
2. 我上面的推断是否有错误之处呢?
3. 已经有了(float*)q、&q[0][0]、q[0]三种调用形式,它们和函数定义中的b[i*n+j]和*(b+i*n+j)是否真的可以任意组合呢?
恳请大虾们指教,谢谢!
问题点数:10、回复次数:7Top
1 楼kobefly(科比--网络学习中)回复于 2005-04-03 19:35:49 得分 4
是否真的可以认为在二维数组a[m][n]中,a[0][i*n+j]和a[i][j]是完全等价、可以互换的呢?使用a[0][i*n+j]是否符合规范,这样有什么安全隐患吗?
这个主要是利用了
c/c++语言没有边界检查的漏洞和数组的顺序存储来实现的
至于是否符合规范,感觉不怎么样
3. 已经有了(float*)q、&q[0][0]、q[0]三种调用形式,它们和函数定义中的b[i*n+j]和*(b+i*n+j)是否真的可以任意组合呢?
其实那三种调用形式,在数组传参数的时候,都退化为指针,也就是说都是一个地址值,效果是一样的拉
b[i*n+j]和*(b+i*n+j)也是一样的Top
2 楼answersha(水少爷)回复于 2005-04-03 19:48:32 得分 3
是等价的,在地址层次上,二者完全是对应的
二维数组中下面的表达是等价的
a[i][j]
*(a[i] + j)
(*(a + i))[j]
*(*(a + i) + j)
具体的,推荐搂住可以看一下《高质量程序设计指南C++/C)Top
3 楼Bosscat(不知天高地厚的波斯猫)回复于 2005-04-05 16:42:57 得分 0
谢谢楼上二位!
可我还想知道,a[0][i*n+j]这样究竟有没有什么安全隐患,或者说,可靠性高不高呢?Top
4 楼juan2001(sdfsdf)回复于 2005-04-05 16:56:19 得分 2
做为数组变量的地址这样定义是可以的,有时为了查找方便只能这样定义,但是有一点你要注意 那就是a[0][i*n+j]中的变量,如果在其它地方被赋值你的数组就会有风险,但是如果是小程序,变量只用一次问题不大建议最好为数组定义专用的变量 ,方便以后对程序的维护Top
5 楼arrowcy(长弓手)回复于 2005-04-05 20:19:06 得分 0
可我还想知道,a[0][i*n+j]这样究竟有没有什么安全隐患,或者说,可靠性高不高呢?
===============================================================================
只要你确保i和j都不超过n就不会有问题Top
6 楼arrowcy(长弓手)回复于 2005-04-05 20:21:44 得分 1
不过这样写移植性可能要差一点点,不过目前大多数的编译程序都是使用的行主序存储,因此不存在太大的问题。Top
7 楼Bosscat(不知天高地厚的波斯猫)回复于 2005-04-06 12:47:51 得分 0
To: juan2001(sdfsdf)
请问你说的在其他地方赋值数组就会有风险,具体是什么风险呢?
为数组定义专用的变量是什么意思
小D驽钝,还望指教?Top




