Вы печатаете адрес не значение
printf("char is %c",*arr);
Попробуйте выполнить это через отладчик, чтобы понять, что происходит, и, пожалуйста, задайте реальный вопрос, например, что, по вашему мнению, должно произойти, и что вы наблюдаете вместо этого. Делая это, вы, вероятно, ответите себе на большинство вопросов.
Кстати, после печати arr является локальной переменной, а sizeof не позволяет узнать размер исходного массива, поэтому он должен иметь размер печати 4. Код ниже показывает это поведение и разницу между массив и указатели, когда дело доходит до sizeof.
Если вы попробуете
РЕДАКТИРОВАТЬ: благодаря комментарию Даниэля код изменился на то, что я на самом деле тестировал, а не только догадывался
#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);
}
Вы получаете:
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