很抱歉,如果之前已经提出这个问题。在我搜索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或者它自己。那么我怎么能像上面这样安全地使用我上面描述的未初始化指针呢?现在是不是指向一个未初始化的指针?
答案 0 :(得分:10)
我的印象是我 宣布和保留空间,但不是 定义,指向struct node的指针,是 那是对的吗?
没有。您正在声明一个指针,在堆栈上为指针分配空间,并为其节点动态分配存储空间。
不要写这样的东西来迷惑自己:
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分配给data
指向的节点实例的名为pnode
的成员。当然,如果你给你的节点一个构造函数(你通常应该这样做),你可以在一个节目中完成所有这些:
struct node
{
int data;
node * next;
node( int n, node * np ) : data( n ), next( np ) {}
};
node * pnode = new node( 10, 0 );
答案 1 :(得分:3)
node *newItem = new node;
您创建:
堆栈上的指针,指向此新节点。
newItem-> data = 100
只需将新分配的节点的data
成员设置为100。
答案 2 :(得分:3)
当你像你一样定义你的结构并像你一样调用new
时,你所做的是:
struct node
。newItem
分配空间,并将其值设置为您分配的新结构的地址。您没有为新结构的任何成员设置任何值。如果您希望在创建结构的新实例时发生这种情况,则需要定义构造函数。
答案 3 :(得分:3)
typedef struct node
{
int data;
node *node;
} *head;
这会将node
声明为结构,并将head
定义为node*
的同义词,因此head
是一种类型而非对象。
这会使此行为非法:temp = head->next;
,因为->
不适用于某种类型。
new node
动态分配node
对象并返回指向它的指针。 node *newItem = new node;
将此指针指定给newItem
。但是请注意,newItem->node
(node
这里是指针对象而不是类型node
)未初始化,因此既不为null也不指向有效的node
对象。
这也是非法的,因为node
没有next
成员。
newItem->next = temp;
我建议您选择一个命名约定,这意味着您将类型和变量分开。这有点令人困惑。