Я пытаюсь присвоить возвращаемый указатель из функции другому указателю.Почему я не могу?
Поскольку функции возвращают значения , а не объекты.Объекты имеют хранилище, которое может содержать и представлять значения.Сами ценности являются временными и неизменными.Четные значения указателя.Ваш пример аналогичен этому:
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}
.