| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 636 人关注过本帖
标题:二维数组与指针,
只看楼主 加入收藏
fenghelong
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
威 望:2
帖 子:209
专家分:197
注 册:2011-8-18
结帖率:26.67%
收藏
已结贴  问题点数:20 回复次数:5 
二维数组与指针,
#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
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:20 
按照内存分配,像a[x][y],x每一个元素都指向有y个int的一位数组的地址,因为静态是连续的,所以这x个y都是连续,那么就可以这样去寻址,如果是动态,就是另外一种。而c[1]因为是动态的,那样写就会错了。不过我每次都这么写的,至少有几十个程序了,都没见错啊……OJ也能过……

酱油实习生
2012-02-07 10:34
fenghelong
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
威 望:2
帖 子:209
专家分:197
注 册:2011-8-18
收藏
得分:0 
回复 2楼 墨清扬
你用过c[1]这种形式的么?
2012-02-08 14:41
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 3楼 fenghelong
用过,没问题。我知道原因了,你建立多维数组的方式不对,我是一个个维度依次分配,你是创建一个一维的,像2行3列的先创建一个**a,然后给a分配一个指向2个int*的空间,然后每个指针(也就是a[0]和a[1])分别再分配3个指向int的空间。这样寻址的时候先根据行号获取指向那一行的指针,再通过列号获取那一行的制定元素,就不会出错。像你这样的话,c[0]是a,c[1]是a的下一个指针,但是这一块一般没有分配,所以会非法访问。如果一定要这样分配,就要把c[x][y]改成c[x*row+y](row是每行元素个数),当然不推荐这样啦。

酱油实习生
2012-02-09 00:21
fenghelong
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
威 望:2
帖 子:209
专家分:197
注 册:2011-8-18
收藏
得分:0 
回复 4楼 墨清扬
能把你的意思贴下代码么?
2012-02-09 18:16
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 5楼 fenghelong
比如要创建二维的:
int **a;
a=(int**)calloc(row,sizeof(int*));
for(i=0;i<row;++i)
    a[i]=(int*)calloc(line,sizeof(int));
释放的时候倒过来

酱油实习生
2012-02-10 19:33
快速回复:二维数组与指针,
数据加载中...
 
   



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

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