Если вы попробуете это:
#include<stdio.h>
void main()
{
char name[]="siva";
printf("name = %p\n", name);
printf("&name[0] = %p\n", &name[0]);
printf("name printed as %%s is %s\n",name);
printf("*name = %c\n",*name);
printf("name[0] = %c\n", name[0]);
}
Вывод:
name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s
Таким образом, «имя» на самом деле является указателем на массив символов в памяти. Если вы попытаетесь прочитать первые четыре байта в 0xbff5391b, вы увидите 's', 'i', 'v' и 'a'
Location Data
========= ======
0xbff5391b 0x73 's' ---> name[0]
0xbff5391c 0x69 'i' ---> name[1]
0xbff5391d 0x76 'v' ---> name[2]
0xbff5391e 0x61 'a' ---> name[3]
0xbff5391f 0x00 '\0' ---> This is the NULL termination of the string
Чтобы напечатать символ, вам нужно передать его значение в printf. На значение можно ссылаться как name [0] или * name (так как для имени массива = & name [0]).
Чтобы напечатать строку, вам нужно передать указатель на строку в printf (в данном случае 'name' или '& name [0]').