指针数组怎么 new ?

BoweirrKing 2003-12-04 07:30:48
我自己定义了一个结构体,其中有个带参数的构造函数,如下:
struct MyStruct
{
int **array; //这个成员能够存储一组指针,是个指针数组。请先注意它的类型
MyStruct(int n)
{
array=&(new int[n]);
};
MyStruct(){};

};

经过试验,new出来的array[0]、array[1]、array[2].....等能够正常工作。

但是实际上,我需要array的类型为 MyStruct,即array中存储的是本类型的一组指针。但是在改了类型后总是出错,出错信息为“ '&' requires l-value”。

请问错出在那里?

对于这个构造函数带有参数的结构体,怎么去new它的指针数组?
...全文
708 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
BoweirrKing 2003-12-09
  • 打赏
  • 举报
回复
那么带参数的指针数组怎么new 呢?

我另外开了个帖子,这个结了,先。

请大家去新贴:

http://expert.csdn.net/Expert/topic/2546/2546561.xml?temp=.1420252

BoweirrKing 2003-12-09
  • 打赏
  • 举报
回复
嗯,我看到了,非常感谢你们的回答。明天结贴给分。

其实我有很多地方还是不大清楚,仍然需要你们的指点,希望以后仍然不吝赐教啊。
yjy1001 2003-12-09
  • 打赏
  • 举报
回复
嘿嘿~!
好热闹!
楼主要注意的问题是 —— 不能直接在结构中定义“实例”,而是定义指向结构的指针

像 楼主的问题,C++中 建议 用std::vector 解决~
firestars 2003-12-09
  • 打赏
  • 举报
回复
老兄象这样:
struct MyStruct
{
int **array; //这个成员能够存储一组指针,是个指针数组。请先注意它的类型
MyStruct(int n)
{
array=&(new int[n]);//错误
//改为
array=new int *[n];//that ok;就是那么简单。

};
~MyStruct(){};

};
constantine 2003-12-09
  • 打赏
  • 举报
回复
//用C++的容器
例如动态创建数组array
vector <int> *array;
array=new vector<T>; //初始化为容量大小和尺寸
array->reserve(Size); //设置一次增加的大小
勉励前行 2003-12-09
  • 打赏
  • 举报
回复
對於動態數組,C++用std::vector來解決,很方便。
lu_zi 2003-12-09
  • 打赏
  • 举报
回复
一般的指向指针的数组可以这样写
int* p[n];
int** p=new int[n];
出于对效率上的考虑,你也可以用两步的方法建对象
gaoshengqiang 2003-12-04
  • 打赏
  • 举报
回复
struct MyStruct;
typedef MyStruct * PMyStruct;
struct MyStruct
{
PMyStruct **array; //存储的是一个“MyStruct类型”的指针数组的“首”地址,然后
//就可以使用array[index]->...来实现对不同的“MyStruct对象”进行

MyStruct(int n)//这个是重载之后的构造函数
{
//array=&(new MyStruct[n]); //这样会进入死循环
array=new PMyStruct[n]; //这样定义的才是指针数组,
//数组里的对象指针应在适当的时候初始化
for(int i=0;i<n;i++)
array[i]=0; //数组清零,以防意外
};
MyStruct(){}; //这个是默认的构造函数
MyStruct(){delete[] array;};

};

//使用:
int n=100;
MyStruct * pS=new MyStruct(n);
MyStruct * p=0;
for(int i=0;i<n;i++)
{
p=new MyStruct(n);
//MyStruct->array[i]=p; //对不起,写错了
pS->array[i]=p;
}
for(int i=0;i<n;i++)
{
p=pS->array[i];
delete p;
}
delete pS;

// 这样做似乎没有任何实际意义,但应该可以回答楼主的问题

gaoshengqiang 2003-12-04
  • 打赏
  • 举报
回复
struct MyStruct;
typedef MyStruct * PMyStruct;
struct MyStruct
{
PMyStruct **array; //存储的是一个“MyStruct类型”的指针数组的“首”地址,然后
//就可以使用array[index]->...来实现对不同的“MyStruct对象”进行

MyStruct(int n)//这个是重载之后的构造函数
{
//array=&(new MyStruct[n]); //这样会进入死循环
array=new PMyStruct[n]; //这样定义的才是指针数组,
//数组里的对象指针应在适当的时候初始化
for(int i=0;i<n;i++)
array[i]=0; //数组清零,以防意外
};
MyStruct(){}; //这个是默认的构造函数
MyStruct(){delete[] array;};

};

//使用:
int n=100;
MyStruct * pS=new MyStruct(n);
MyStruct * p=0;
for(int i=0;i<n;i++)
{
p=new MyStruct(n);
MyStruct->array[i]=p;
}
for(int i=0;i<n;i++)
{
p=pS->array[i];
delete p;
}
delete pS;

// 这样做似乎没有任何实际意义,但应该可以回答楼主的问题

qibo999 2003-12-04
  • 打赏
  • 举报
回复
是不对,你在定义里就申请实例当然不对了,会旋入死循环。
可以定义一个指针,指向下一个结点,这样就形成一个裢了:

struct MyStruct
{
MyStruct * next;
...
}
就可以了。


MyStruct(int n)//这个是重载之后的构造函数
{
array=&(new MyStruct[n]); //这里array已经定义,当有一个实例时就会分配一定的空间了,无需在这里分配,并且,这样写就进入死循环了,不断地构造
};

BoweirrKing 2003-12-04
  • 打赏
  • 举报
回复
我想实现多级的链表的功能。

struct MyStruct
{
MyStruct **array; //我希望它存储的是一个“MyStruct类型”的指针数组的“首”地址,
//然后就可以使用array[0],array[1]等等来实现对不同的“MyStruct对象”
//进行操作,是不是我这里就写错了? :(

MyStruct(int n)//这个是重载之后的构造函数
{
array=&(new MyStruct[n]); //关键在此处,我现在就不明白,为什么用int可以
//而用MyStruct类型就不可以?是因为自己声明自己
//的缘故吗?
};
MyStruct(){}; //这个是默认的构造函数

MyStruct *Left; //左结点
MyStruct *Right; //右结点
MyStruct *Parent; //父结点
int NumOfChild; //本结点的子结点个数
};

我的最终目的是:只要知道最高级父结点的信息,就可以访问其他的结点。实际上,那个array,我是想用它来存储本结点下面的子结点地址的,由于子结点数量不定,所以想用new来做。

是不是我这样的想法就不对呢?请尽管指教,我可以推翻原来的想法重新再做的。:)
qibo999 2003-12-04
  • 打赏
  • 举报
回复
delete MyStruct;
qibo999 2003-12-04
  • 打赏
  • 举报
回复
改一局啊:

MyStruct array[] = new MyStruct;

--->

MyStruct *array = new MyStruct[n];
qibo999 2003-12-04
  • 打赏
  • 举报
回复
错了,错了。按你的思路,你这样做根本不对头。,没有必要在构造函数里写,也不对。

这样就行了:

struct MyStruct
{
...
MyStruct(){};
};

...
MyStruct array[] = new MyStruct;
...
delete [] MyStruct;
BoweirrKing 2003-12-04
  • 打赏
  • 举报
回复
谢谢楼上的回帖 :)
关键代码我都贴上来了。

我实际上是建立这样的一个东西:
struct MyStruct
{
int **array; //我希望它存储的是一个“MyStruct类型”的指针数组的“首”地址,然后
//就可以使用array[0],array[1]等等来实现对不同的“MyStruct对象”进行
//操作,是不是我这里就写错了? :(

MyStruct(int n)//这个是重载之后的构造函数
{
array=&(new MyStruct[n]); //关键在此处,我现在就不明白,为什么用int可以
//而用MyStruct类型就不可以?是因为自己声明自己
//的缘故吗?
};
MyStruct(){}; //这个是默认的构造函数

};

您看看我还哪里没有说明白?我其实一直在线等着呢。
短歌如风 2003-12-04
  • 打赏
  • 举报
回复
此外你分配指针数组的方法是不正确的,因为使用取了临时对象的地址。
应该是:
typedef int * pint
array = new pint[n];
然后需要对每个元素去分配内存。
由于不知道你想要用这个int**代表什么含义,无法帮你修改。
短歌如风 2003-12-04
  • 打赏
  • 举报
回复
struct MyStruct
{
int **array;
MyStruct(int n);
MyStruct(){};

};
inline MyStruct::MyStruct(int n)
{
...
}
qibo999 2003-12-04
  • 打赏
  • 举报
回复
你是怎么写的?贴上来
pzoon 2003-12-04
  • 打赏
  • 举报
回复
xuexi

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧