¿Cuáles son las distinciones entre los diversos símbolos (*, &, etc.) combinados con los parámetros? [duplicar

Posible duplicado:
c ++ * vs & en la declaración de función

Sé que esto probablemente parezca una pregunta increíblemente elemental para muchos de ustedes, pero realmente he tenido dificultades para encontrar una explicación buena y exhaustiva, a pesar de mi mejor búsqueda en Google. Estoy seguro de que la respuesta está disponible, por lo que mis términos de búsqueda deben ser terribles.

En C ++, se utilizan una variedad de símbolos y combinaciones de los mismos para marcar parámetros (así como argumentos para esos parámetros). ¿Cuáles son exactamente sus significados?

Ex: ¿Cuál es la diferencia entrevoid func(int *var) yvoid func(int **var)? Qué pasaint &var?

La misma pregunta representa los tipos de retorno, así como los argumentos. Que haceint& func(int var) mean, en comparación conint* func(int var)? Y en argumentos, ¿cómo funcionay = func(*x) difiere dey = func(&x)?

Estoy más que feliz de leer enormes volúmenes sobre el tema si solo pudieras señalarme en la dirección correcta. Además, estoy extremadamente familiarizado con los conceptos generales de programación: OO, genéricos / plantillas, etc., pero no con la notación utilizada en C / C ++.

EDITAR Parece que he dado la impresión de que no sé qué son los punteros. Me pregunto cómo podría ser eso:)

Entonces, para aclarar: entiendo perfectamente cómo funcionan los punteros. Lo que soyn agarrar, y soy extrañamente incapaz de encontrar respuestas, es el significado de, por ejemplo, 'void func (int & var)'. En el caso de una declaración de asignación, el operador '&' estaría en el lado derecho, como en 'int * x = & y;', pero en lo anterior, el operador '&' está efectivamente en el lado izquierdo. En otras palabras, está operando en el valor l, en lugar del valor r. Esto claramente no puede tener el mismo significado.

¿Espero tener más sentido ahora?