Вы должны адаптировать свое использование к любой ситуации.
В первом случае вы берете два значения по значению в качестве параметров и возвращаете int. Поскольку ваши параметры являются значениями, любые изменения, примененные к ним, будут иметь только область действия функции.
Например:
int returnSomething(int a, int b)
{
a = 0;
b = 0;
return 0;
}
//....
int x = 3;
int y = 4;
returnSomething(a,b);
// x will still be 3, y will still be 4
Во втором случае, поскольку вы передаете параметры как указатели, вы сможете изменять значения.
int returnSomething(int* a, int* b)
{
*a = 0;
*b = 0;
return 0;
}
//....
int x = 3;
int y = 4;
returnSomething(&a,&b);
// x and y will be 0 here
В третьем случае, кроме передачи параметров по их указателю, вы возвращаете указатель на int. Это означает, что внутри функции вы должны выделить память и освободить ее, когда закончите. Я не рекомендую использовать это, обычно есть обходные пути для этого.
int* returnSomething(int* a, int* b)
{
int* x = malloc(sizeof(int));
*x = 1;
return x;
}
//....
int x = 3;
int y = 4;
int* z = returnSomething(&a,&b);
free(z);
Ответ: это зависит от того, что вы хотите сделать. Если вам нужно изменить значение параметров в методе, передайте по ссылке или по указателю. Я бы не рекомендовал использовать последний метод.
Кроме того, это применимо, потому что вы имеете дело с типами POD. Если у вас есть собственная структура, будет более эффективно передавать ее по указателю или возвращать указатель, поскольку новую копию делать не нужно.