Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 阵列及;指针_C++_Arrays_Pointers - Fatal编程技术网

C++ 阵列及;指针

C++ 阵列及;指针,c++,arrays,pointers,C++,Arrays,Pointers,寻找一些关于数组和指针的帮助,并解释我正在尝试做什么。 我想在Foo*类型的堆上创建一个新数组,以便以后可以将在其他地方创建的对象分配给该数组。当我做下面的事情时,我很难准确地理解我在创造什么 Foo *(*f) = new Foo*[10]; 同样,一旦我创建了数组,我如何访问每个元素,例如 (f + 9)->fooMember(); ?????? 提前感谢。您可以使用以下代码创建指针数组: Foo** f = new Foo*[10]; 然后使用以下命令访问元素: f[9]-&g

寻找一些关于数组和指针的帮助,并解释我正在尝试做什么。 我想在Foo*类型的堆上创建一个新数组,以便以后可以将在其他地方创建的对象分配给该数组。当我做下面的事情时,我很难准确地理解我在创造什么

Foo *(*f) = new Foo*[10];
同样,一旦我创建了数组,我如何访问每个元素,例如

(f + 9)->fooMember(); ??????

提前感谢。

您可以使用以下代码创建指针数组:

Foo** f = new Foo*[10];
然后使用以下命令访问元素:

f[9]->fooMember();
之后一定要清理干净:

delete[] f;

谢谢。

您可以使用以下代码创建指针数组:

Foo** f = new Foo*[10];
Foo *(*f) = new Foo*[10];
然后使用以下命令访问元素:

f[9]->fooMember();
之后一定要清理干净:

delete[] f;
谢谢

Foo *(*f) = new Foo*[10];
声明中的括号是不必要的,因此这与:

Foo **f = new Foo*[10];
在任何情况下,
newfoo*[10]
都会为十个
Foo*
s分配空间,并使它们未初始化。它返回一个指向数组中初始
Foo*
的指针(第0个元素),您将该元素指定给
f

要访问数组元素,只需使用订阅:

f[0] = new Foo;
f[0]->fooMember();
请记住,使用
new[]
创建的任何内容都必须在完成后通过在指针上调用
delete[]
释放一次。例如:

delete[] f;
这不会删除数组中由
Foo*
s指向的元素。如果使用
new
创建
Foo
对象,则必须在删除数组之前
删除它们。例如,要释放我们在上面创建的元素:

delete f[0];
声明中的括号是不必要的,因此这与:

Foo **f = new Foo*[10];
在任何情况下,
newfoo*[10]
都会为十个
Foo*
s分配空间,并使它们未初始化。它返回一个指向数组中初始
Foo*
的指针(第0个元素),您将该元素指定给
f

要访问数组元素,只需使用订阅:

f[0] = new Foo;
f[0]->fooMember();
请记住,使用
new[]
创建的任何内容都必须在完成后通过在指针上调用
delete[]
释放一次。例如:

delete[] f;
这不会删除数组中由
Foo*
s指向的元素。如果使用
new
创建
Foo
对象,则必须在删除数组之前
删除它们。例如,要释放我们在上面创建的元素:

delete f[0];

在这种情况下,您可能会发现以下代码段很有用:

首先是初始化:

Foo** f = new Foo*[10];
for (int i = 0; i < 10; i++) {
    f[i] = new Foo;
}
最后,为了保持事物整洁并防止内存泄漏:

for (int i = 0; i < 10; i++) {
    delete f[i];
}
delete[] f;
for(int i=0;i<10;i++){
删除f[i];
}
删除[]f;

遇到这种情况时,您可能会发现以下代码片段很有用:

首先是初始化:

Foo** f = new Foo*[10];
for (int i = 0; i < 10; i++) {
    f[i] = new Foo;
}
最后,为了保持事物整洁并防止内存泄漏:

for (int i = 0; i < 10; i++) {
    delete f[i];
}
delete[] f;
for(int i=0;i<10;i++){
删除f[i];
}
删除[]f;

数组和指针不是很像C++。怎么样

std::vector<std::shared_ptr<Foo> > f;
f.push_back(std::make_shared<Foo>(whatever, arguments, you, need));
// ...
f[9]->fooMember();
// ...
std::向量f;
f、 推回(std::使_共享(无论什么,参数,您,需要));
// ...
f[9]->foomber();
// ...

无需手动清理:-)

数组和指针不是很像C++。怎么样

std::vector<std::shared_ptr<Foo> > f;
f.push_back(std::make_shared<Foo>(whatever, arguments, you, need));
// ...
f[9]->fooMember();
// ...
std::向量f;
f、 推回(std::使_共享(无论什么,参数,您,需要));
// ...
f[9]->foomber();
// ...


无需手动清理:-)

谢谢。如果我想不使用[]运算符而使用指针运算来访问单个元素,这会是什么样子?@Thomas:
f[0]
只是
*(f+0)
的简写,因此,例如,您可以执行
(*(f+0))->foomber()
。谢谢。第一个括号中的*播放的是哪一卷?@Thomas:开头的括号会导致解引用和子操作符
->
对对象进行操作,而不是指针。就像指针逻辑的其余部分一样,它有时也会令人困惑。@Thomas:为什么不使用方括号呢?它们的存在有一个原因:当您对数组执行随机访问时,简化了代码。谢谢。如果我想不使用[]运算符而使用指针运算来访问单个元素,这会是什么样子?@Thomas:
f[0]
只是
*(f+0)
的简写,因此,例如,您可以执行
(*(f+0))->foomber()
。谢谢。第一个括号中的*播放的是哪一卷?@Thomas:开头的括号会导致解引用和子操作符
->
对对象进行操作,而不是指针。就像指针逻辑的其余部分一样,它有时也会令人困惑。@Thomas:为什么不使用方括号呢?它们的存在有一个原因:当您对数组执行随机访问时,简化了代码。您应该在显式编写的循环上使用
std::for_each
。@Billy ONeal-这是假设您要使用STL。尽管这几乎总是正确的,但这仍然是一个假设。for循环仍然合法有效,C++。@ Knnle:True。然而,仅仅因为某事是可能的或有效的并不意味着它是完成事情的最好方法。算法调用总是比显式循环好。@Billy ONeal:你能为每个调用编写等价的
?代码是否会比普通的
for
循环更简单或更复杂?我倾向于使用最简单的方法,即留下易于阅读的代码的方法,公平地说,我必须考虑如何为每个调用编写这两个
。。。所以我想写作的容易程度也会影响我写什么的决定。在这种情况下,我会像Khnle所做的那样去做。@Billy我只能说-bllcks。你应该在显式编写的循环上使用
std::for_each
。@Billy ONeal-这是假设你要使用STL。尽管这几乎总是正确的,但这仍然是一个假设。for循环仍然合法有效,C++。@ Knnle:True。然而,只是因为