| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 636 人关注过本帖
标题:二维数组与指针,
取消只看楼主 加入收藏
fenghelong
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
威 望:2
帖 子:209
专家分:197
注 册:2011-8-18
结帖率:26.67%
收藏
已结贴  问题点数:20 回复次数:2 
二维数组与指针,
#include <iostream>
using namespace std;
void Func1(int **c, int a, int b)
{
  cout<<c[0][0]<<endl;
  cout<<c[1][0]<<endl;
}
void main ()
{
  int i;
  int *a = new int[2*3];
  int **p = &a;
  for(i=0; i<2*3; i++) {
    a[i] = i;
  }
  Func1(p, 2, 3);
}
编译运行, 如果你像我一样运气好的话, 程序不会崩溃, 你会得到一组数字:
0
3436320
    如果定义a[2][3]这样的二维数组, 我们在使用的时候编译器会将a[x][y]采用形如p+3*x+y的寻址方式, 因为编译器知道我们的一行是3个元素.
    在Func1函数里, 传入的是双重指针, 接收的是**p也是双重指针, 可是使用的时候呢? 上面的是错误的示例, 因为在函数内部编译器不知道你这个数组是几行几列的.
    它没法将c[x][y]转换成p+3*x+y的寻址方式. 所以我需要同时传入两个额外的参数a和b来表示数组的行列, 在使用的时候我就可以手动将c[x][y]转换成p+a*x+y, 再加上取值符号就可以取出正确的值: *(p+a*x+y)
    实际上如果你使用c[x][y]这样的形式(如上面的程序), 编译器不会报错, 但是你运行的时候, 就有很大的几率崩溃, 因为编译器将行列错误的进行了解析.
    这时编译器是这样编译的:
    它取出c[x]作为行的首地址, 再加上y.
    由于c[0]一定是传入数组的首地址, 所以c[0][y]这样的访问都是OK的, 只要你不越界.
    c[1]我们就不知道是个什么东西了, c[1][y]这样的访问就是一个随机数, 当访问到无法访问的地方时, 程序就会崩溃.



红色的话希望能解释下好么,谢谢
搜索更多相关主题的帖子: void include 编译器 元素 
2012-02-06 18:48
fenghelong
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
威 望:2
帖 子:209
专家分:197
注 册:2011-8-18
收藏
得分:0 
回复 2楼 墨清扬
你用过c[1]这种形式的么?
2012-02-08 14:41
fenghelong
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
威 望:2
帖 子:209
专家分:197
注 册:2011-8-18
收藏
得分:0 
回复 4楼 墨清扬
能把你的意思贴下代码么?
2012-02-09 18:16
快速回复:二维数组与指针,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040300 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved