这段与指针相关的代码有什么问题
What is wrong in this code related to pointer
/* The structure of the Linked list Node is as follows:
struct Node
{
int val;
struct Node *next;
Node(int data){
val = data;
next = NULL;
}
};
*/
void intersection(Node **head1, Node **head2,Node **head3)
{
cout<<*head1->val;
}
上面的代码不起作用,但是当我使用另一个指针 Node* h1=*head1;
然后打印它的值时它工作正常。在这两个代码中,我要打印的值是相同的,那为什么上面的代码是错误的;
/* The structure of the Linked list Node is as follows:
struct Node
{
int val;
struct Node *next;
Node(int data){
val = data;
next = NULL;
}
};
*/
void intersection(Node **head1, Node **head2,Node **head3)
{
Node* h1=*head1;
cout<<h1->val;
}
在此代码段中
void intersection(Node **head1, Node **head2,Node **head3)
{
cout<<*head1->val;
}
表达式
*head1->val
等同于
*( head1->val )
(因为后缀运算符->的优先级高于一元运算符*)但是指针head
没有指向结构类型的对象。它指向另一个指针,你必须写
( *head1 )->val
这相当于带有中间变量的表达式h1
Node* h1 = ( *head1 );
h1->val;
为了使差异更明显,您可以按以下方式重写访问数据成员的表达式val
( **head ).val
现在表达式 **head
产生类型为 struct Node
的对象的 lvalue
。
或者使用像
这样的中间变量
Node *h1 = *head;
( *( h1 ) ).val
^
|
*head
运算符优先级将 ->
放在 *
之前。举例说明:
#include<iostream>
struct foo {
int x;
};
int main() {
foo f;
foo* fp = &f;
foo** fpp = &fp;
auto& xref = f.x;
std::cout << &xref << "\n";
//std::cout << *fpp->x; // error
std::cout << &(*fpp)->x;
}
标记为//error
的行无法编译,因为fpp
没有成员x
。另外两行打印相同的地址,即 f.x
.
的地址
/* The structure of the Linked list Node is as follows:
struct Node
{
int val;
struct Node *next;
Node(int data){
val = data;
next = NULL;
}
};
*/
void intersection(Node **head1, Node **head2,Node **head3)
{
cout<<*head1->val;
}
上面的代码不起作用,但是当我使用另一个指针 Node* h1=*head1;
然后打印它的值时它工作正常。在这两个代码中,我要打印的值是相同的,那为什么上面的代码是错误的;
/* The structure of the Linked list Node is as follows:
struct Node
{
int val;
struct Node *next;
Node(int data){
val = data;
next = NULL;
}
};
*/
void intersection(Node **head1, Node **head2,Node **head3)
{
Node* h1=*head1;
cout<<h1->val;
}
在此代码段中
void intersection(Node **head1, Node **head2,Node **head3)
{
cout<<*head1->val;
}
表达式
*head1->val
等同于
*( head1->val )
(因为后缀运算符->的优先级高于一元运算符*)但是指针head
没有指向结构类型的对象。它指向另一个指针,你必须写
( *head1 )->val
这相当于带有中间变量的表达式h1
Node* h1 = ( *head1 );
h1->val;
为了使差异更明显,您可以按以下方式重写访问数据成员的表达式val
( **head ).val
现在表达式 **head
产生类型为 struct Node
的对象的 lvalue
。
或者使用像
这样的中间变量Node *h1 = *head;
( *( h1 ) ).val
^
|
*head
运算符优先级将 ->
放在 *
之前。举例说明:
#include<iostream>
struct foo {
int x;
};
int main() {
foo f;
foo* fp = &f;
foo** fpp = &fp;
auto& xref = f.x;
std::cout << &xref << "\n";
//std::cout << *fpp->x; // error
std::cout << &(*fpp)->x;
}
标记为//error
的行无法编译,因为fpp
没有成员x
。另外两行打印相同的地址,即 f.x
.