You print the address not the value use
printf("char is %c",*arr);
Try to run this through a debugger to understand what happens, and please ask a real question, like what do you think should happen, and what you observe instead. By doing this you will probably answer yourself to most of your question.
By the way, once in print, arr is a local variable, and sizeof as no way to know the size of the original array, so it should print size is 4. The code below shows this behavior, and a difference between array and pointers when it comes to sizeof.
If you try
EDIT: changed code to something I actually tested, rather than just guessed, thanks to Daniel's comment
#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);
}
You get :
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