C语言二叉树节点创建:结构体成员输入需&与->配合吗?
为什么用
->访问结构体成员时,scanf仍需要加&? 核心原因和->无关,只和**scanf的工作机制以及结构体成员的类型**有关:
scanf的本质要求scanf的格式占位符(除了%s、%[]这类针对字符串/字符数组的特殊情况),都需要接收变量的内存地址——只有拿到地址,它才能把用户输入的值写入对应的内存空间里。如果直接传变量的值,scanf会把这个值当成内存地址去操作,必然触发非法内存访问,也就是你遇到的崩溃(退出码-1073741819是Windows系统中典型的内存访问错误)。->的作用是什么?newnode->data等价于(*newnode).data,它的作用是直接获取结构体成员data的值(如果data是普通变量类型的话),而不是获取它的地址。不管你用.(针对结构体变量)还是->(针对结构体指针)访问成员,只要成员是普通非指针类型,它的结果都是变量的值,不是地址。为什么之前操作链表不用加
&?
你之前的链表节点大概率是这种情况:typedef struct ListNode { char* content; // 成员是指针类型 struct ListNode* next; } ListNode;这时候
node->content本身就是一个地址(指针变量存储的就是内存地址),所以传给scanf("%s", node->content)时,直接传的就是地址,符合scanf的要求,自然不用加&。本次二叉树节点的区别
你的二叉树节点定义应该是类似这样:typedef struct BTNode { char data; // 成员是普通char变量,不是指针 struct BTNode* left; struct BTNode* right; } BTNode;这里的
newnode->data是一个普通的char值,不是地址。所以必须用&newnode->data来获取这个char变量的内存地址,传给scanf后,它才能正确把输入的字符写入到这个地址对应的空间里。
总结一下:
- 若结构体成员是非指针类型的基本变量(char、int、float等),不管用
.还是->访问,scanf都需要加&取地址; - 若成员是指针类型(比如char*),直接传成员名就是传地址,无需加
&。
内容的提问来源于stack exchange,提问作者SpaciousCoder78
相关产品推荐
相关产品推荐

