Il fait ses premiers pas au théâtre en 1955 en créant Judas de Marcel Pagnol, avant de débuter l’année suivante au cinéma dans Rencontre à Paris de Georges Lampin. Il tourne avec les plus grands réalisateurs de l’époque, notamment Georges Franju, Marcel Carné et Jean Renoir, mais c’est la télévision qui lui offre ses premiers grands rôles : Rouletabille dans Le Mystère de la chambre jaune de Jean Kerchbron et Sganarelle dans Dom Juan ou Le Festin de pierre de Marcel Bluwal en 1965, et surtout François Vidocq dans Les Nouvelles Aventures de Vidocq de 1971 à 1973, où il remplace Bernard Noël (acteur), qui était dans les années 1960 le protagoniste de la première série.
Ce n’est qu’en 1974 avec Les Seins de glace de Georges Lautner qu’il se fait véritablement remarquer au cinéma, obtenant la consécration avec Un éléphant ça trompe énormément d’Yves Robert en 1976, qui lui vaut un César du meilleur acteur dans un second rôle en 1977. Le succès du film entraîne une suite en 1978, Nous irons tous au paradis.
En 1980, il se voit décerner le César du meilleur acteur pour son rôle dans La Guerre des polices.
Il a tourné dans plus de 90 films dont La Boum de Claude Pinoteau, où il interprète le père de Vic (Sophie Marceau), Les Loups entre eux de José Giovanni, et plus récemment dans Camping et Le Héros de la famille (2006).
De 2003 à 2007, il joue le policier Franck Keller dans la série télévisée du même nom, diffusée sur TF1. Plus récemment, en 2015 et 2016 on le retrouve au cinéma dans L’Étudiante et Monsieur Henri d’Ivan Calbérac et Camping 3 de Fabien Onteniente.