我正在尝试将一个函数返回的指针分配给另一个指针。我为什么不能简单示例:
int * foo(int * x)
{
return x;
}
int main()
{
int * x = NULL;
int * y = NULL;
foo(x) = y;
}
答案 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);