这个问题看起来确实很愚蠢,但我总是浪费很多时间,在解决这种问题之前进行测试/错误。
我需要一个指针来返回函数的值,然后我需要除以这个值,但我有编译器错误:
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(,我尝试强制转换为int,只得到指针地址等。
您的直接问题是,您已经将x
声明为指向int的指针,但您正试图将其用作int。要简单地更正最后一行,请取消引用指针(就像您在test()
中正确地做的那样(:
float res = *x / 2;
现在,您似乎真的尝试过了,但却出现了错误,这并不奇怪,因为您对x
的初始化很糟糕:
int *x = 20;
这不会创建一个20的int值并使x指向它。它将x设置为指向由整数值20表示的内存地址。这可能是保留内存,这就是为什么当你试图取消引用它时会出现错误的原因
(你不会在test()
中得到这个错误,因为你已经传递了x
的地址作为参数。所以在那里取消引用它实际上确实会得到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;
(最后,我相信,在任何情况下,如果你想得到一个浮点结果而不是int,你都想在最后一行使用2.0
,而不仅仅是2
。(
int * x = 20;
表示:x
是指向存储在地址20
的int
的指针。当您尊重它时,CPU将尝试从地址20
读取int
值,但地址20
在当前进程空间中是无效地址,因此您的程序崩溃。
您可能想说的是:x
是指向int
的指针,它指向的int
的值是20
,对吗?好吧,这应该是:
int someInt = 20;
int * x = &someInt;
现在x
指向someInt
存储其值的任何地址(实际上它在主函数的堆栈空间上,但那只是一个侧节点(,并且存储在该地址的值实际上是20
。