CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

关于二维数组和指针的问题请教(清楚不清楚都进来看一下吧)

楼主Bosscat(不知天高地厚的波斯猫)2005-04-03 18:49:44 在 C/C++ / C++ 语言 提问

小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

相关问题

  • 用指针表示二维数组?
  • 关于二维数组赋值问题,请大家帮忙看一下
  • 二维数组与二维指针的赋值问题!
  • 关于指针的指针和二维数组的疑问
  • 二级指针 如何转换成 二维数组的指针?
  • 请问指针的指针,二维数组,指针数组,之间有何区别
  • 一个二维数组串指针作参数问题
  • 请问如何返回一个二维数组的指针?
  • 请问双重指针如何操作二维数组?
  • 怎样返回一个二维数组的头指针

关键词

  • c++
  • 指针
  • 函数
  • 安全隐患
  • n+j
  • 数组
  • 二维
  • 等价
  • 变量
  • 调用

得分解答快速导航

  • 帖主:Bosscat
  • kobefly
  • answersha
  • juan2001
  • arrowcy

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo