Ваша непосредственная проблема в том, что вы объявили x
как указатель на int, но вы пытаетесь использовать его как int. Чтобы просто исправить последнюю строку, разыменуйте указатель (точно так же, как вы правильно сделали внутри test()
):
float res = *x / 2;
Теперь, похоже, вы действительно попытались это сделать и получили ошибку, что неудивительно потому что вы плохо инициализировали x
:
int *x = 20;
Это не создает значение int 20 и не указывает на него 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;
(И, наконец, я считаю, что в любом случае вы хотите использовать 2.0
в последней строке, а не просто 2
, если вы хотите получить результат с плавающей точкой вместо int.)