如何访问指针的数组元素

How to access array elements of pointers

本文关键字:指针 数组元素 访问 何访问      更新时间:2023-10-16

如何从我的节点指针数组访问元素?底部的 cout 返回地址"0xb7738ff4"。即使我创建一个构造函数并将每个元素设置为 NULL,我以后也无法修改其中任何一个。

#include <iostream>
using namespace std;
class Node
{
    public:
    char character;
};
class Tree
{
    public:
    Node* nodes[26];
};
int main() {
 Tree t;
 //t.nodes[0]->character = 'a';
 cout << """ << (t.nodes[0]) << """;
}

http://ideone.com/XvLme9

t.nodes[0]返回一个Node*指针。 您将该指针按原样传递给cout,这就是为什么它打印内存地址(并且是随机地址,因为您没有初始化数组)。 如果要打印节点的character,则必须取消引用Node*指针,就像注释掉的代码所做的那样(这是正确的方法):

t.nodes[0]->character

您只需要确保nodes[0]返回指向真实Node对象的有效指针即可:

Tree t;
t.nodes[0] = new Node; // <-- here
t.nodes[0]->character = 'a';
std::cout << """ << t.nodes[0]->character << """ << std::endl;

使用完节点后,不要忘记delete节点。 Tree应该有一个析构函数来释放它拥有的节点。

尝试更多类似的东西:

#include <iostream>
#include <stdexcept>
class Node
{
public:
    char character;
    Node(char c = 0);
};
class Tree
{
private:
    Node* nodes[26];
    int count;
public:
    Tree();
    ~Tree();
    Node* add(char c);
    Node* get(int idx);
};
Node::Node(char c)
    : character(c)
{
}
Tree::Tree()
    : count(0)
{
    for (int i = 0; i < 26; ++i)
        nodes[i] = NULL;
}
Tree::~Tree()
{
    for (int i = 0; i < count; ++i)
        delete nodes[i];
}
Node* Tree::add(char c)
{
    if (count == 26)
        throw std::runtime_error("nodes array is at its max capacity");
    Node *node = new Node(c);
    nodes[count++] = node;
    return node;
}
Node* Tree::get(int idx)
{
    if ((idx < 0) || (idx >= count))
        throw std::out_of_range("invalid index");
    return nodes[idx];
}
int main()
{
    Tree t;
    t.add('a');
    std::cout << """ << t.get(0)->character << """ << std::endl;
}

话虽如此,您应该使用 std::liststd::forward_list 而不是编写自己的树类:

#include <list>
int main()
{
    std::list<char> l;
    l.push_back('a');
    std::cout << """ << l.front() << """ << std::endl;
}

或:

#include <list>
class Node
{
public:
    char character;
    // other things here...
    Node(char c = 0);
    Node(const Node &src);
    Node& operator=(const Node &rhs);
};
Node::Node(char c)
    : character(c)
{ 
}
Node::Node(const Node &src)
    : character(src.character)
{
}
Node& Node::operator=(const Node &rhs)
{
    character = src.character;
    return *this;
}
int main()
{
    std::list<Node> l;
    l.push_back('a');
    std::cout << """ << l.front().character << """ << std::endl;
}