Vous imprimez l'adresse et non la valeur.
printf("char is %c",*arr);
Essayez d'utiliser un débogueur pour comprendre ce qui se passe, et posez une vraie question, par exemple ce que vous pensez qu'il devrait se passer et ce que vous observez à la place. En faisant cela, vous répondrez probablement à la plupart de vos questions.
D'ailleurs, une fois dans print, arr est une variable locale, et sizeof n'a aucun moyen de connaître la taille du tableau original, donc il devrait afficher size is 4. Le code ci-dessous montre ce comportement, et une différence entre les tableaux et les pointeurs quand il s'agit de sizeof. Si vous essayez
EDIT : j'ai changé le code pour quelque chose que j'ai réellement testé, plutôt que juste deviné, grâce au commentaire de Daniel.
#include <stdio.h>
void print(char *);
int main(int argc, char ** argv)
{
char temp = 'r';
char temp2[] = {'a','b'};
char temp3[] = {'r'};
print(&temp);
print(temp2);
print(temp3);
printf("sizeof temp is %d\n",sizeof(&temp));
printf("sizeof temp2 is %d\n", sizeof(temp2));
printf("sizeof temp3 is %d\n",sizeof(temp3));
return 0;
}
void print(char * arr)
{
printf("size of arr is %d\n", sizeof(arr));
printf("arr contains %c\n", *arr);
}
Vous obtenez :
size of arr is 4
arr contains r
size of arr is 4
arr contains a
size of arr is 4
arr contains r
sizeof temp is 4
sizeof temp2 is 2
sizeof temp3 is 1