| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1597 人关注过本帖
标题:关于动态内存分配
只看楼主 加入收藏
russilong
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2005-8-23
收藏
 问题点数:0 回复次数:23 
关于动态内存分配
*****
int i,j;
cin>>i>>j;
int* ptr=new int[i][j];
错在哪 ?

[此贴子已经被作者于2005-8-23 21:44:20编辑过]


搜索更多相关主题的帖子: 内存 动态 
2005-08-23 21:28
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
你自己看看,这能行吗?左边是一维的,而右边是二维的,类型不匹配嘛。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-08-24 12:09
russilong
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2005-8-23
收藏
得分:0 
那我想问一下二楼的高人,正确的二维数组该如何写呢?

因为我以前碰到的没有高维的情况。多谢!

2005-08-24 17:28
vitrual
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2005-8-22
收藏
得分:0 
以下是引用russilong在2005-8-24 17:28:50的发言: 那我想问一下二楼的高人,正确的二维数组该如何写呢? 因为我以前碰到的没有高维的情况。多谢!
int(* ptr)[j]=new int[i][j];吧 PS:kai斑竹,我一直有个疑问希望解答一下. int * p;int a[2][3];这里要p=a[0]; a[0]理解为2维数组的首地址,如果理解成指针的话,那a[0]也就等于*(a+0),那a可不可以理解成指向指针的指针?但如果那样,int ** p=a; 却不行?

[此贴子已经被作者于2005-8-24 18:00:18编辑过]

2005-08-24 17:40
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
楼上两位,现在我累了,睡过一觉以后再来回答你们的问题.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-08-25 14:55
vitrual
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2005-8-22
收藏
得分:0 
以下是引用kai在2005-8-25 14:55:17的发言: 楼上两位,现在我累了,睡过一觉以后再来回答你们的问题.
呵呵,不好意思麻烦了. 我认为不管 几维数组他的数组名都只是一维的指针对吗?
2005-08-25 17:24
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
楼上两位,回答给得迟了些,望见谅,
下面是这个问题的释义性程序,千言万语不如一段实际的代码。
#include <iostream>
using namespace std;

int main()
{
    int i = 0, j = 0, k = 0;
    // manipulate data with two dimensional array through pointer
    cout<<"manipulate data with two dimensional array through pointer"<<endl;
    int a [2][3] = {
        {1,2,3},
    {4,5,6}
    };
    int * p = a[0];
    for(i = 0; i<2; i++)
    {
        for(j = 0; j<3; j++)
    {
            cout<<*((p+i)+j)<<" ";
        }
        cout<<endl;
    }
    cout<<endl;

    // create data with new without dimension
    cout<<"create data with new without dimension"<<endl;
    int * pI = new int;
    *pI = 3;
    cout<<*pI<<endl;
    delete pI;
    cout<<endl;

    // create data with new in one dimension
  cout<<"create data with new in one dimension"<<endl;
    int * pOne = new int[3];
    for(i = 0; i<3; i++)
    {
        *(pOne+i) = i+1;
        cout<<*(pOne+i)<<" ";
    }
    delete [] pOne;
    cout<<endl<<endl;
   
    // create data with new in two dimension
  cout<<"create data with new in two dimension"<<endl;
    int (* pTwo)[3] = new int[2][3];
    for(i = 0; i<2; i++)
    {
        for(j = 0; j<3; j++)
        {
            *(*(pTwo+i)+j) = (i+1)*(j+1);
            //pTwo[i][j] = (i+1)*(j+1);
            cout<<*(*(pTwo+i)+j)<<" ";
        }
        cout<<endl;
    }
    delete [] pTwo;
  cout<<endl;

    // create data with new in multidimension
  cout<<"create data with new in multidimension"<<endl;
    int (* pMulti)[3][4] = new int[2][3][4];
  for(i = 0; i<2; i++)
    {
        for(j = 0; j<3; j++)
        {
            for(k = 0; k<4; k++)
            {
                *(*(*(pMulti+i)+j)+k) = (i+1)*(j+1)*(k+1);
                cout<<*(*(*(pMulti+i)+j)+k)<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
    }
    delete [] pMulti;

    return 0;
}   

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-08-26 09:57
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
vitrual, 下面是你的那个关于指针的指针的问题: int * p;int a[2][3];这里要p=a[0]; a[0]理解为2维数组的首地址,如果理解成指针的话,那a[0]也就等于*(a+0),那a可不可以理解成指向指针的指针?但如果那样,int ** p=a; 却不行? 回答: int ** p=a; 却不行, 这是C++ 语言的合理性( 我的个人理解) 既然是多维数组, 那么就要体现一个多维的空间性,而 int ** p 是什么呢? 它不能体现一个空间性的问题,所以不合理. 这里所指的空间性是指在各个维上的空间范围, 比如 inta[2][3] 中的2,3 便表明了2维的空间性, 即 2 * 3. 我们将 * 看作 一个维, 那么 ** 便表征了2维,*** 便表征了 3 维, 这点没错, 但是这个空间度却没有体现出来, 所以不合理. 再来看 int * p; int a[2][3]; p = a[0], 这样 p 就表征了2维数组的首地址, 你也可以这样写 p = &a[0][0]; 这样也指向了这个2维数组的首地址. 而 int ** p; 这里 p 正如你所说的是一个指向指针的指针, 而不管是 a, 还是 a[0] 或 &a[0][0],都不是指向指针的指针, 顶多是一个指针而已,就是说是一个地址,所以你看到了 左边是地址的地址, 而右边是地址,所以两边的类型无论如何都不一致,所以不可以这样写. 再次申明,以上观点是我的个人观点, 如有错误请指正. 对于指向指针的指针的用法通常在函数的参数中予以应用, 我从网上找到一片相关文章.你可以看一下, 下面是这篇文章的连接: http://www.codeguru.com/Cpp/Cpp/cpp_mfc/pointers/article.php/c4089/ 另外你的那个观点: 我认为不管 几维数组他的数组名都只是一维的指针对吗? 我的回答是: 你的观点是对的.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-08-26 11:20
russilong
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2005-8-23
收藏
得分:0 
kai,你的程序看过了,多谢了!
 
还想问一下:开辟了堆中的二维或多维空间后,用delete[] P能确保完全释放么?  

[此贴子已经被作者于2005-8-26 11:46:07编辑过]



2005-08-26 11:29
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
russilong, 我认为是能的. 你不必一个一个释放空间, 通过 delete [] pointerName; 就实现了释放所有开辟的空间.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-08-26 11:51
快速回复:关于动态内存分配
数据加载中...
 
   



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

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