Jac*_*cob 1 c++ pointers initialization reference
当我做leetcode时,我尝试用这种方式初始化指针
ListNode *node1,*node2;
ListNode *p1=node1,*p2=node2;
Run Code Online (Sandbox Code Playgroud)
它在我的以下逻辑中为我提供了空指针错误中的成员访问权限。
while(head) {
if(head->val<x) p1=p1->next=head;
}
Run Code Online (Sandbox Code Playgroud)
但如果我将初始化更改为:
ListNode node1,node2;
ListNode *p1=&node1,*p2=&node2;
Run Code Online (Sandbox Code Playgroud)
不会出现错误,那么,这两种初始化方式有什么区别呢?
Run Code Online (Sandbox Code Playgroud)ListNode *node1,*node2;
这两个是指针。它们是默认初始化的,这对于指针来说意味着未初始化。它们不指向任何东西,并且读取未初始化值的程序的行为将是未定义的。
Run Code Online (Sandbox Code Playgroud)ListNode *p1=node1,*p2=node2;
这两个是另一对指针。它们是通过复制先前指针的值来初始化的,因此它们将指向相同的对象。但前两个指针未初始化。程序的行为是未定义的。不要读取未初始化的值。
Run Code Online (Sandbox Code Playgroud)ListNode node1,node2;
这两个不是指针(假设ListNode不是指针类型的别名)。它们也是默认初始化的,这可能意味着未初始化,具体取决于ListNode类型的定义方式。
Run Code Online (Sandbox Code Playgroud)ListNode *p1=&node1,*p2=&node2;
&是运算符的地址。它产生操作数的地址。这两个指针使用先前声明的对象的地址进行初始化,即它们指向那些对象。这些对象的(可能)未初始化的值根本不会被读取。不涉及未定义的行为。
请注意,如果headinhead->val<x指向 或 之一node1,node2并且这些节点确实仍未初始化,则第二个程序也会出现未定义的行为。