为什么这个指针操作不起作用?

时间:2017-02-08 17:15:42

标签: c pointers

所以我有一系列链表

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;

3 个答案:

答案 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]类型为nodeins类型为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;