Если вы не хотите передавать указатель, вы можете передать объединение. Объявите объединение как структуру, но вы можете использовать только один член за раз. Например:
union foo {
char c;
int i;
}
struct foo f;
f.c = 'd';
function (f);
f.i = 23;
function(f);
int function(union foo f)
...
Помните, что вы можете использовать только одно поле за раз, и если вы установите, например, f.c на что-то, значение f.i изменится потенциально беспорядочно. (Я считаю, что это неопределенное поведение, но если компилятор когда-либо делает что-либо, кроме побайтной замены, он не сможет скомпилировать весь существующий код.) Кроме того, помните, что язык не дает подсказки относительно того, какое поле вы в последний раз изменили так что вам решать как-то это отслеживать.
Это не очень чистое решение, но и не void *
. Вы пытаетесь подорвать
система типов, и вы не получите хорошего решения.