Выражение C должно быть изменяемым указателем, возвращающим значение l - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь присвоить возвращаемый указатель из функции другому указателю.Почему я не могу?Простой пример:

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

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

Ответы [ 4 ]

0 голосов
/ 13 октября 2018

Я пытаюсь присвоить возвращаемый указатель из функции другому указателю.Почему я не могу?

Поскольку функции возвращают значения , а не объекты.Объекты имеют хранилище, которое может содержать и представлять значения.Сами ценности являются временными и неизменными.Четные значения указателя.Ваш пример аналогичен этому:

double bar(void) {
    return 1.0;
}

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

Возвращаемое значение bar() является значением.Вы не можете присвоить его, потому что он не является объектом и не имеет связанного хранилища.

Вы можете сделать обратное: присвоить возвращаемое значение bar() переменной y, например: y = bar().Это хорошо, потому что y обозначает объект (это идентификатор переменной, самый распространенный вид объекта).Выражения, которые обозначают объекты, называются «lvalues», потому что они могут появляться на l eft стороне операторов присваивания и также могут быть оценены для получения value s.

Различные типы, в том числе с указателем, здесь не учитываются.Каждый завершенный тип предоставляет как lvalue, так и non-lvalue выражения этого типа.

Вы можете разыменовать допустимые выражения указателя, однако даже те, которые сами не являются lvalue, и такие выражения являются lvalue.Таким образом, эта вариация в вашей программе будет принята:

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}.

0 голосов
/ 13 октября 2018

Значение l оператора присваивания должно быть переменной, а не значением.Вы не можете использовать функцию, так как функция возвращает значение (передача по значению в C).Так и должно быть

y = foo(x);
0 голосов
/ 13 октября 2018

Попробуйте это для удовольствия.

#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;
}
0 голосов
/ 13 октября 2018

Поскольку функция, возвращающая указатель, должна находиться справа от = -> 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...