Hola, sí, es como entendiste. En C, void* es un tipo de puntero genérico, que puede apuntar a cualquier tipo de dato. Se utiliza para crear funciones y estructuras de datos que sean independientes del tipo de dato con el que trabajen.
Cuando una función devuelve un puntero void*, es necesario hacer un cast (conversión de tipo) al tipo de puntero que necesitemos antes de utilizarlo. Por ejemplo, si sabemos que la función devuelve un puntero a int, podemos hacer un cast de la siguiente manera:
void* ptr_gen;
int* ptr_int;
ptr_gen = funcion_que_devuelve_void_ptr();
ptr_int = (int*) ptr_gen; // Hacemos el cast a int*
Si no se hace el casteo antes de utilizar el puntero, se generará un error o advertencia de compilación, ya que el compilador no puede deducir automáticamente a qué tipo de dato apunta un void*.
En cuanto al efecto de asignarle un tipo al puntero, sí, tiene un efecto en las operaciones aritméticas de punteros. Cuando se realizan operaciones como puntero++ o puntero+=4, el compilador ajusta el valor del puntero según el tamaño del tipo de dato al que apunta. Por ejemplo:
int* int_ptr;
char* char_ptr;
int_ptr++; // Avanza el puntero al siguiente entero (normalmente 4 bytes)
char_ptr++; // Avanza el puntero al siguiente caracter (normalmente 1 byte)
Si no se hace el casteo antes de realizar estas operaciones aritméticas, el compilador no sabrá cuánto debe avanzar el puntero, ya que desconoce el tamaño del tipo de dato al que apunta un void*.