Ben dis moi ce que tu n'as pas compris et je tenterais de t'expliquer. En gros l'idée c'est qu'on peut caster d'un objet "non const" vers un objet "const" mais pas le contraire (et même si c'est possible il faut pas le faire :p).
Lorsqu'un objet est déclaré const dans le prototype d'une fonction comme c'est le cas pour toi, cette fonction te garantit que ce paramètre ne sera pas modifié. En effet :
1) const char * = char const * = les chars pointés par le char * sont maintenus constant
2) char * const = le pointeur char * est maintenu constant mais pas les chars pointés
3) const char * const = char const * const = tout est maintenu constant.
Ceci dit ca ne sert à rien car le pointeur est recopié sur la pile lors de l'appel de la fonction donc de toute façon même si strcpy changeait ce pointeur ça n'aurait pas d'impact sur le reste du programme. On peut donc se passer de ce deuxième const qui ne sert en fait à rien.
Partant de là on comprend aisément que la chaine source est en toute logique garantie constante par la fonction strcpy. C'est donc bien un const char *. Alors pourquoi les gens du C on mis ce const ? Tout simplement si tu appellès strcpy avec pour source un const char *. En effet si le const ne figurait pas dans le prototype, gcc refuserait de compiler car strcpy ne garantirait plus la constance de cette source.
Exemple :
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void f(const char * src){
char * plop = (char *)malloc(sizeof(char)*strlen(src));
strcpy(plop,src); // Ici on a besoin de garantir la constance de src
printf("%s\n",plop);
free(plop);
}
int main(){
const char *src="j'aime les tapirs";
f(src);
return 0;
}
J'espère que c'est plus clair pour toi sinon n'hesite pas à demander des precisions.
Bonne chance