Debes hacer lo mismo que el tu ultimo codigo de punteros a funciones, pero trabajando con punteros a variables.
Antes que nada una cosa: tu programa se para en la linea 12 porque el return evita que siga ejecutandose, aun cuando sea una funcion recursiva. Es decir, que cuando haces la recursion con el return en la linea 12 esa funcion no espera que termine la ejecucion de la funcion llamada para seguir con la linea 13, sino que finaliza esa funcion y nunca llega a la linea 13. Todas las operaciones tienes que hacerlas antes del return.
El informe de errores: en la linea 14 estas asignando a una referencia (*b es una referencia); solo puedes asignarle valores desreferenciandola (p.ej. *b=x) o asignandole otra referencia (b=&x); en cualquier caso eso no te soluciona el ejercicio.
En la linea 29 estas asignando una funcion de forma incorrecta (ni la referencias ni la llamas de forma directa).
"...tengo duda con el void no entiendo es como si no aceptara una variable tipo float no me queda claro ese error..."
Lo que te dice el compilador es que en la linea 29 no puedes asignar directamente a una variable tipo float una funcion tipo void()(float), la variable es float y la funcion es void por muchos floats que lleve como argumentos.
En el main tienes la variable 'c' que indicará el tamaño del valor 'num'; 'c' es un entero iniciado a 0 por defecto y 'num' es un real entrado por el usuario:
Código:
int c = 0;
float num = 236;
La funcion 'tam()' recibe dos argumentos: el valor de trabajo 'num' (que siguiendo el ejemplo de tu codigo en el ambito de la funcion 'tam' pasa a llamarse 'a'), y una referencia al sitio donde se guarda el resultado 'c':
Código:
void tam(float a, int *c) {...}
En la funcion tienes un condicional que cuando no se cumple no hace nada (simplemente termina la funcion), y cuando se cumple incrementa 1 el contador 'c' y hace una recursion con el nuevo valor calculado, de forma que la rellamada a 'tam' se hace enviando los dos argumentos esperados: un valor real (en este caso un decimo de 'a'), y una referencia al resultado. Como la funcion ya recoge una referencia de entrada para el resultado, para la rellamada no tienes de re-referenciar esa variable porque ya está referenciada (es un puntero):
Código:
if((-1 > a) || (a > 1)) {
*c += 1;
tam (a/10, c);
}
Solo te queda hacer la primera llamada desde el main, que tal como está descrita la funcion tam() tendras que enviarle dos argumentos: un valor real y una referencia (un puntero) al valor resultado:
Ahora en 'c' ya tienes el valor esperado, lo sacas por pantalla y finalizas.
Saludos
vosk