C表达式必须是可修改的左值返回指针

时间:2018-10-13 14:15:27

标签: c pointers

我正在尝试将一个函数返回的指针分配给另一个指针。我为什么不能简单示例:

int * foo(int * x)
{
    return x;
}

int main()
{
    int * x = NULL;
    int * y = NULL;
    foo(x) = y;
}

4 个答案:

答案 0 :(得分:2)

尝试这个有趣。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int *foo(int *x) {
    return x + rand() % 3;
}

int main(void) {
    int x[3] = {0};
    srand(time(0));
    *foo(x) = 42;
    printf("x is {%d, %d, %d}\n", x[0], x[1], x[2]);
    return 0;
}

答案 1 :(得分:2)

  

我正在尝试将一个函数返回的指针分配给另一个指针。我为什么不能呢?

因为函数返回的是,而不是对象。对象具有可以包含和表示值的存储。值本身是瞬态且不可变的。偶数指针值。您的示例与此类似:

double bar(void) {
    return 1.0;
}

int main() {
    double y = 0.0;
    bar() = y;
}

bar()的返回值是一个值。您不能分配给它,因为它不是对象并且没有关联的存储。

您可以执行相反的操作:将bar()的返回值分配给变量y,就像这样:y = bar()。很好,因为y指定一个对象(它是变量的标识符,是最常见的对象类型)。指定对象的表达式称为“左值”,因为它们可以出现在赋值语句的 l 端,也可以求值以产生 value s。

不同的类型(包括具有指针性质的类型)在这里并没有真正考虑在内。每个完整类型都提供该类型的左值和非左值表达式。

您可以取消引用有效的指针表达式,即使是本身不是左值的指针表达式,此类表达式也是左值。因此,您程序上的这种变化将被接受:

int *foo(int *x) {
    return x;
}

int main() {
    int nums[2] = { 42, 7 };
    int *x = &nums[0];
    int *y = &nums[1];

    *foo(x) = *y;
}

最终赋值会将foo()指向(num[0])的返回值设置为y指向(num[1])的值的对象。也就是说,在分配之后,数组nums包含元素{7, 7}

答案 2 :(得分:0)

因为返回指针的函数应该在=-> y = foo(x)的右侧。

这不是一个简单的例子来说明:

#include<stdio.h>

int *foo(int *x)
{
    return x;
}

int main(void)
{   
    int *x=NULL;
    int *y=NULL;
    int a=9;

    x=&a;

    y=foo(x);
    printf("%d\n",*y);

    return 0;
}

输出: 9

答案 3 :(得分:0)

赋值运算符的l值应该是变量,而不是值。
您不能使用函数,因为该函数返回一个值(在C中按值传递)。所以应该

y = foo(x);