所以我有一系列链表
node* x = (node*) malloc(sizeof(node) * 500);
现在我要插入此列表
int value;
value = 50;
node* ins;
ins = (node*) malloc(sizeof(node));
ins->val = value;
ins->next = &x[20];
&x[20] = ins;
错误我得到了; 1值作为赋值的左操作数
如果您想查看节点结构
typedef struct node {
int val;
struct node* next;
} node;
为什么不能做这样的工作?我想学习:D
编辑:错误指向此行
&x[20] = ins;
答案 0 :(得分:3)
这里的问题是,当您编写&x[20]
时,您将返回数组x
的第20个元素的地址。创建数组x
后,您无法更改其元素在内存中的显示位置。您可以更改数组元素的内容,但这些元素的不会更改。因此,编写&x[20] = ins
是非法的,因为对此语句的最自然的解释是"将x
的第20个元素移动到ins
所指向的位置。&# 34;
另一方面,代码x[20] = ins
更好(但仍有问题)。这意味着"更改数组x
的第20个元素的内容,以保存ins
中存储的地址。"请注意,"存储在 x[20]
"中的地址之间存在差异。 (由x[20]
)和" x[20]
的地址,"由(&x[20]
)给出。
该行代码的问题是x[20]
类型为node
,ins
类型为node*
。您的意思是使x
成为node**
(指向node*
数组的指针吗?如果您进行了更改,那么该行应该编译。
从技术上讲,这里的问题是address-of运算符返回 rvalue ,但是你只能将 lvalues 放在赋值语句的左侧。右值是一个像137或"你好"在某种意义上,这代表了一种纯粹的价值观。这不是某个地方你可以放东西的名字。写137 = x
之类的东西是不合法的,因为你不能在{34}中存储x
" 137,与写&x[20] = ins
的方式相同,因为您无法存储ins
"" &x[20]
。
答案 1 :(得分:1)
我猜测x
是指向节点的指针数组。所以
node** x = (node**) malloc(sizeof(node*) * 500);
然后,您希望将新节点的地址存储在x
的空闲插槽中x[20] = ins;
虽然我不确定20来自哪里
您的原始构造
&x[20] = ins;
根本没有意义,你试图改变数组成员的地址,不允许
答案 2 :(得分:1)
它不是1值,它是左值,L和LOVE一样。
&x[20] = ins;
大概说,取数组x中的第20个元素。找到它的地址,改变它。您永远不能更改指针,您只能更改指针指向的值。因此,左值(出现在赋值左侧的表达式)只能是* node,而不是& node。 你不需要再次分配ans。您已经分配了一堆节点对象。你可以做到
x[20].val = value;
可能不是你想要的。但是接着你就可以将你的x改为一个指向节点对象的指针数组:
node** x = (node**) malloc(sizeof(node*) * 500);
然后做
x[20] = ins;