Pues si que... vaya por dios q mal.
Sobre la funcion 'suma' tienes razón que al devolver una matriz machaco el puntero a 'a'.
Lo que he hecho es crearme otra matriz en main 'int **aux' por ejemplo, le reservo memoria con aux = new int*[tam] y le asigno lo que me devuelve la funcion suma.
Antes de hacer eso tambien me funcionaba bien el programa, pero supongo que la zona de memoria donde apuntaba 'a' se quedaba en el aire y solo 'destruia' b y c. Y aunque funcione no creo q este bien dejar cosas por ahi divagando. Así q gracias por tu ayuda q me ha servido de mucho
------------------------------------------
Si los programadore cazaran...elefantes:
Cita: Programador Assembler.
No los cazan, crean sus propios elefantes, mas rápidos y pequeños.
Cita: Programador VISUAL BASIC.
Con el mouse dan doble-click en los rifles, dan doble-click en las balas, dan doble-click en el elefante. Esto realmente divierte tanto al elefante que lo hace revolcarse de risa por el suelo y aplasta el mouse. Mientras, el programador VISUAL BASIC se queda mirando como el elefante se aleja tranquilamente.
Cita: Programador C++
Toman un elefante abstracto y derivan de el un nuevo elefante (ej. MiElefante) con todas las propiedades que necesitan. Para cazar uno simplemente, una instancia class Cazador, llama al método CazarElefante el cual la envía el mensaje CAZAR a la class Elefante que lo entiende con un método virtual puro, cuya implementacion esta definida en la nueva clase derivada MiElefante. Esta implementación llama al método setEstoyCazado() que pone el atributo bEstoyCazado =TRUE, con lo que el elefante se da por enterado que ha sido cazado. La class MiElefante esta disponible para ser rehusada/extendida por otro proyecto, ventajas de la OOP.