这个问题肯定看起来很愚蠢,但我总是浪费很多时间,用testerrors直到它工作,这种问题。
我需要一个指针从一个函数中返回一个值,然后我需要除以这个值,但我有编译器错误。
invalid operands to binary / (have 'int *' and 'int')
在下面的代码中,我试着用"& "来表示
void test(int *x, int y)
{
*x = *x+y;
}
int main()
{
int *x = 20;
int y = 1;
test(&x, y);
printf("x: %i", x);
float res = x / 2; // error: invalid operands to binary / (have 'int *' and 'int')
//float res = *x / 2; // application crash with this one. (GCC native Android)
}
我试着用"&",但没有用(x = 0),我试着用 "cast "转为 "int",但只得到指针地址,等等。
你眼前的问题是,你已经声明了 x
作为指向int的指针,但你是想把它作为一个int来使用。 要简单地纠正最后一行,取消引用指针(就像你已经在 test()
):
float res = *x / 2;
现在,看来你真的试过了,并得到了一个错误,这并不奇怪,因为你已经初始化了. . x
糟糕的是。
int *x = 20;
这并不能创造一个20的int值,并使x指向它。它将x设置为指向 内存地址 用整数值20表示。这可能是保留的内存,这就是为什么当你试图取消引用它时,你会得到一个错误。
(你不会在 test()
因为你已经把地址传给了 x
作为论据。 所以,在那里dereferencing它实际上确实能让你得到20--大概是这样)。)
为了让指针发挥作用,可以这样做。
int x = 20;
...
test(&x, y)
...
float res = x / 2;
或者:
int *x = malloc(sizeof(int));
*x = 20;
...
test(x, y)
..
float res = *x /2;
但你真的把这变得太难了。由于你只需要从函数中输出一个值,只要让函数返回那个值就可以了。那么你就完全没有必要去搞指针了。
int test(x,y) { return x+y; }
...
int x = 20;
...
x = test(x,y);
...
float res = x / 2;
(最后,我相信在任何情况下,你都希望使用) 2.0
在最后一行,不只是 2
如果你想得到一个float的结果,而不是一个int的结果。)
int * x = 20;
意思是 x
是一个指针,指向一个 int
存于 20
. 当你违抗它时,CPU会尝试读取一个。int
地址值 20
,但处理 20
是当前进程空间中的无效地址,因此程序崩溃。
你可能想说的是 x
是一个指向一个 int
的价值,以及 int
它所指向的是 20
对吗?嗯,这本来是。
int someInt = 20;
int * x = &someInt;
现在... x
指向哪个地址 someInt
存储了它的值(其实是在主函数的堆栈空间上,但那只是一个侧节点),而存储在该地址的值其实是 20
.