指向指向对象的指针的指针是如何工作的? 我是C++新手,想了解指针。我在某处读到一个例子,它是这样的: #include<iostream> #define N 5 using namespace std; class Test { int x, y; public: Test(int a, int b) : x(a), y(b) { } void print() { cout << x << " " << y << endl; } }; int main() { Test **arr = new Test*[N]; for (int i = 0; i < N; i++) { arr[i] = new Test(i, i + 1); } for (int i = 0; i < N; i++) { arr[i]->print(); } }

指向指向对象的指针的指针是如何工作的? 我是C++新手,想了解指针。我在某处读到一个例子,它是这样的: #include<iostream> #define N 5 using namespace std; class Test { int x, y; public: Test(int a, int b) : x(a), y(b) { } void print() { cout << x << " " << y << endl; } }; int main() { Test **arr = new Test*[N]; for (int i = 0; i < N; i++) { arr[i] = new Test(i, i + 1); } for (int i = 0; i < N; i++) { arr[i]->print(); } },c++,pointers,C++,Pointers,据我所知,**arr意味着它是指向指向对象的指针。因此,当我们将其分配给newtest*[N]时,是否意味着*arr存储N个对象指针的地址 如果它是正确的,那么如何从对象数组中打印对象的地址呢?假设我想在现代C++中打印对象测试的地址[3 ]?< p>,有比拥有原始指针更好的替代方案,还有比手工新< >数组的更好的替代方案。 有容器(如std::vector),有智能指针(如std::unique_ptr和std::shared_ptr) 多态性需要通过指针(包括智能指针)或引用来完成,但这不

据我所知,
**arr
意味着它是指向指向对象的指针。因此,当我们将其分配给
newtest*[N]
时,是否意味着
*arr
存储N个对象指针的地址


如果它是正确的,那么如何从对象数组中打印对象的地址呢?假设我想在现代C++中打印对象测试的地址[3 ]?

< p>,有比拥有原始指针更好的替代方案,还有比手工<代码>新< <代码> >数组的更好的替代方案。 有容器(如
std::vector
),有智能指针(如
std::unique_ptr
std::shared_ptr

多态性需要通过指针(包括智能指针)或引用来完成,但这不是发布代码中的一个因素

OP POST代码有内存泄漏,因为它没有清除
arr
。在这类小程序中,内存泄漏有时会被手动清除并忽略

对于您发布的代码,我会这样做,这样就完全消除了指针:

#include <iostream>
#include <vector>

using std::cout;
using std::vector;

constexpr int N = 5;

class Test {
    int x;
    int y;
public:
    Test(int x_, int y_)
        : x{x_}, y{y_}
    { }

    void print() const {
        cout << x << " " << y << "\n";
    }
};

int main() {
    vector<Test> arr;

    for (int i = 0; i < N; i++) {
        arr.emplace_back(Test{i, i+1});
    }

    for (auto const& test : arr) {
        test.print();
    }
}
#包括
#包括
使用std::cout;
使用std::vector;
constexpr int N=5;
课堂测试{
int x;
int-y;
公众:
测试(整数x_uux,整数y_ux)
:x{x},y{y}
{ }
void print()常量{

第一个问题的答案是肯定的

对于第二个问题,只需将指针发送到cout,而无需取消引用

 cout << arr[3];
如果要从方法打印,请使用this指针:

void print() 
{
    cout << this <<  "- " << x << " " << y << endl; 
}
void print()
{

我认为C++代码>测试**ARR <代码>是不合适的,因为我通常认为它是代码>测试**ARR 。没有<代码> ** ARR <代码> > <代码>测试**>代码>命名<代码> ARR 。如果数组是*arr,那么您将打印指针
arr[3]
此示例不适用于初学者,至少您不应将其作为良好实践的示例。它显示了一些不好的实践,特别是这里没有理由使用单个指针。请注意您在网上找到的教程,其中大多数都是垃圾
测试**arr;
arr
可能是指向指向一个测试的指针;或者它可能是指向每个指向一个测试的指针数组的指针;或者它可能是指向一个指向一个测试数组的指针;或者它可能是指向一个指向一个测试数组的指针数组的指针。上述任何指针都可能是
nullptr
@Shadow,而有效代码是任何在一行上做这种声明的人应该被画出来并分成四等分。任何公平的社会都会有适当的法律来处理这样的人。现在,让我们讨论一下大括号的位置。OP的代码在数据结构中构建了适当的对象,所以你也应该这样做。使用
emplace\u back
而不是
push\u back。那家伙问:“我怎么用指针?”你的回答是:“看这里,怎么用别的东西”…你当时没有回答他的问题all@Eljay谢谢你的建议。但是在OP的代码中,
Test**arr=new Test*[N]
,表达式是
new Test*[N]
表示
arr
是指向N个类型为
Test
的对象的指针数组?@abhis1312•否,
arr=new Test*[N]
表示
arr
是指向指针数组的指针。数组中的这些指针都没有指向任何对象,它们是未初始化的。
 printf("%p", arr[3]);
void print() 
{
    cout << this <<  "- " << x << " " << y << endl; 
}