如果之前有人问过这个问题,我很抱歉。在我通过 SO 进行搜索时,我没有找到一个询问我想知道什么的人。
基本上,当我有这个时:
typedef struct node
{
int data;
node *node;
} *head;
并执行 node *newItem = new node;
我的印象是我正在声明和保留空间,而不是定义指向 struct node
的指针,对吗?
所以当我这样做的时候
newItem->data = 100
和 newItem->next = 0
我很困惑。 newItem = 0
究竟会声明什么? data
和next
?对象作为一个整体?
当我使用 typedef 时,我特别困惑。哪一部分是宏?我假设节点是因为我就是这样调用它的,但为什么我需要它?
最后,当我这样做时会发生什么:
node *temp;
temp = new node;
temp = head->next;
head->next = newItem;
newItem->next = temp;
我的意思是,head->next 是一个指向对象 newItem 的指针,所以我假设不是 newItem.data 或 next 本身。那么我怎样才能像这里一样安全地使用我上面描述的未初始化指针呢? head 现在不指向未初始化的指针吗?
最佳答案
I am under the impression that I am declaring and reserving space, but not defining, a pointer to struct node, is that correct?
没有。您正在声明一个指针,在堆栈上为该指针分配空间,并为它动态分配一个节点的存储空间。
不要因为写这样的东西而迷惑自己:
typedef struct node
{
int data;
node * next;
} *head;
用C++写结构体的方法是:
struct node
{
int data;
node * next;
};
您现在可以创建一个指针:
node * pnode;
为指针分配存储。
并且你可以为一个节点动态分配存储空间,并让指针指向它:
pnode = new node;
或者一次完成:
node * pnode = new node;
现在当你说:
pnode->data = 10;
你没有分配任何东西。您正在分配 10 给pnode
指向的节点实例的名为data
的成员。当然,如果您已经为您的节点提供了一个构造函数(您通常应该这样做),您可以一次完成所有工作:
struct node
{
int data;
node * next;
node( int n, node * np ) : data( n ), next( np ) {}
};
node * pnode = new node( 10, 0 );
关于c++ - 指针初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2985039/