class temp;
temp *t;
void foo() { temp foo2; t[1] = foo2; }
int main() {
t = new temp[100];
foo();
//t[1] is still in memory?
}
temp **t;
temp **t = new temp[100][1];
是
有没有更好的方法来做到这一点
4个方括号? 答案 0 :(得分:12)
代码:
t = new temp[100];
构造一个类型为temp的数组100个对象。做同样事情的更安全的方法是:
std::vector <temp> t(100);
这使你无需在数组上调用delete []。
答案 1 :(得分:4)
在你确切知道自己在做什么之前,尽量避免使用新的东西。
std::vector<temp> t(100);
将以完美的方式完成工作。您仍然可以使用[]运算符访问它,就像您的解决方案一样。
temp foo2; t[1] = foo2;
将调用temp类的赋值运算符。 使用&amp;用于将变量传递给函数。
void foo1(std::vector<temp>& lt)
{
}
void foo2(temp& lt)
{
}
foo1(t);
foo2(t[1]);
答案 2 :(得分:1)
首先,我支持其他人的建议,以避免新的和使用std :: vector。 std :: vector可以避免由指针和数组引起的许多麻烦。数组是一个非常C的解决方案,而不是C ++解决方案。
回答你的问题:这里你不需要指向指针的类型。原因是数组是由指针自然寻址的。
当你说t = new temp[100];
两件事情发生时:
t
设置为指向新数组的第一个元素。当您使用p[i]
运算符时,它实际上是*(p + i)
的语法糖。例如:
t[0]
相当于*(t + 0)
,它只是*t
,或t
指向的元素:数组的第一个元素。t[1]
相当于*(t + 1)
。由于t
是指向数组第一个元素的指针,因此t + 1
是指向第一个元素之外的元素的指针:第二个元素。因此*(t + 1)
为您提供了第二个元素。使用此系统,temp *
指针可用于引用整个temp
数组,而不只是一个temp
实例。
如果你真的想学习数组和指针,你可能会比阅读comp.lang.c FAQ的第6章更糟糕。但请注意,这是C资源,而不是C ++资源;这是因为在C ++中,通常不使用数组,因为您有更好的可用功能:std :: vector。我强烈建议你学习std :: vector比学习指针和数组更重要。