2012-01-18 20 views
49

Me han confundido con lo que veo en la mayoría de los programas en C que tienen una declaración de función desconocida para mí.¿Cuál es la función de un asterisco antes del nombre de una función?

void *func_name(void *param){ 
    ... 
} 

¿Qué significa * para la función? Mi comprensión sobre (*) en un tipo de variable es que crea un puntero a otra variable por lo que puede rastrear la dirección en la que está almacenada la última variable en la memoria. Pero en este caso de una función, no sé lo que implica este asterisco *.

+4

Sería una pregunta muy interesante preguntar a la persona que escribió el código por qué pusieron el asterisco junto al nombre de la función, en lugar de 'void * nombre_func' o' void * nombre_func'. Si pueden llegar a un argumento racional por qué, me impresionaría. – Lundin

+8

Argumento Racional: porque estamos acostumbrados a escribir "int * a", por lo que parece más consistente hacer lo mismo con las funciones – Guillaume

+1

Además de lo que escribió Guillaume, la salida de la función es un puntero que debe anularse. Igual que con 'int * a' es un apuntando a un entero no que a es de tipo entero-puntero. – dhein

Respuesta

58

El asterisco pertenece al tipo de retorno, y no al nombre de la función, es decir .:

void* func_name(void *param) { . . . . . } 

Esto significa que la función devuelve un vacío puntero.

+10

gracias por las respuestas chicos, pero ¿qué significa un puntero de vacío? ? – Aldee

+6

Es solo una dirección a una ubicación en la memoria. No sabe a qué apunta, depende de usted ubicar el puntero al tipo apropiado que luego pueda usar. Por supuesto, convertirlo en un tipo no válido (por ejemplo, digamos que void * apunta a un float, pero lo convierte en un char) producirá resultados indefinidos. –

+1

@AldeeMativo: Además, consulte http://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming – NPE

10

El * pertenece al tipo de devolución. Esta función devuelve void *, un puntero a alguna ubicación de memoria de tipo no especificado.

Un puntero es un tipo de variable en sí mismo que tiene la dirección de alguna ubicación de memoria como su valor. Los diferentes tipos de puntero en C representan los diferentes tipos que espera que residan en la ubicación de memoria a la que se refiere la variable de puntero. Por lo tanto, se espera que int * haga referencia a una ubicación que se pueda interpretar como int. Pero un void * es un tipo de puntero que hace referencia a una ubicación de memoria de tipo no especificado. Tendrá que lanzar un puntero vacío para poder acceder a los datos en la ubicación de la memoria a la que se refiere.

5

Significa que la función devuelve un void*.

+1

es decir, esa función devuelve un puntero genérico. –

16

El * se refiere al tipo de devolución de la función, que es void *.

Cuando se declara una variable de puntero, que es lo mismo que poner el * cerca del nombre de la variable o el tipo de variable:

int *a; 
int* a; 

personalmente considero la primera opción más clara, porque si quieres Definición de múltiples punteros utilizando el separador de ,, tendrá que repetir el * cada vez:

int *a, *b; 

usando el "cierre para escribir la sintaxis" puede ser engañoso en este caso, porque si escribir:

int* a, b; 

Usted está declarando un puntero a int (a) y un int (b).

¡Entonces, también encontrará esa sintaxis en los tipos de devolución de funciones!

+0

sí. Yo también pienso de esa manera. gracias @puller .. – Aldee

+3

"si quiere definir varios punteros usando el operador,". Esto se considera un estilo de programación deficiente, ya que conduce a errores cuando se combinan punteros y variables del mismo tipo. La solución no es ofuscar la forma en que declaras los punteros, la solución es _declarar cada variable en una línea propia. No existe ningún caso en el que tenga sentido declarar varias variables en la misma fila. ¿Qué estás tratando de lograr al hacerlo, guardar las pulsaciones del teclado? Claramente, el desgaste del teclado es un asunto más serio que la legibilidad del código ... – Lundin

+1

Nunca dije que hiciera eso. Dije que es una razón para preferir la sintaxis "close-to-variable-name", porque nunca crea confusión. Y dije que es una posible explicación para la misma sintaxis utilizada en las interfaces de función. –

Cuestiones relacionadas