find -type f -name '*.c' -exec grep -l "$1" {} +
1) Le répertoire par défaut est le courant, inutile de le préciser avec "."
;
2) En précisant le type des fichiers que tu recherches, tu évites à find(1) de faire ce que tu lui demandes sur ceux qui ne sont pas dudit type, et donc gagnes en perfs
;
3) Tu peux utiliser ici la syntaxe {} + de l'option -exec car grep(1) accepte plusieurs noms de fichiers en tant qu'arguments. Ceci a pour conséquence d'exécuter qu'une et une seule fois grep(1), i.e., "grep foo1 foo2 ... fooN" à l'opposé de "grep foo1; grep foo2; grep ...; grep fooN".
NB1 : la syntaxe {} + n'existe que dans la version GNU et BSD de find(1), cependant elle est bien définie par POSIX mais n'est pas acceptée, donc n'est pas portable.
NB2 : {} est substitué par chaque nom de fichier (chaque chemin absolu), donc le nombre d'arguments maximum défini par ARG_MAX (getconf ARG_MAX pour connaître sa valeur) rentre en compte. À toi de voir si tu peux l'utiliser ou non, mais en règle générale, tu ne risques pas de dépasser ladite limite. 