在C99中的除法中使用指针,错误:无效操作数为二进制数

问题描述 投票:0回答:1

这个问题肯定看起来很愚蠢,但我总是浪费很多时间,用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",但只得到指针地址,等等。

c pointers c99
1个回答
1
投票

你眼前的问题是,你已经声明了 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的结果。)


0
投票

int * x = 20; 意思是 x 是一个指针,指向一个 int 存于 20. 当你违抗它时,CPU会尝试读取一个。int 地址值 20,但处理 20 是当前进程空间中的无效地址,因此程序崩溃。

你可能想说的是 x 是一个指向一个 int 的价值,以及 int 它所指向的是 20对吗?嗯,这本来是。

int someInt = 20;
int * x = &someInt;

现在... x 指向哪个地址 someInt 存储了它的值(其实是在主函数的堆栈空间上,但那只是一个侧节点),而存储在该地址的值其实是 20.

© www.soinside.com 2019 - 2024. All rights reserved.