problem v C - retezec vs ukazatel
František Boček
bocekf
Středa Březen 17 12:04:59 CET 2004
Zdravim,
> >
> >Clar *menu[3]={"1. Info","2. Teplota","3. Cas/Datum"};
> >
> >/* V pameti bude ulozeno:
> >'1' '.' 0x20 'I' 'n' 'f' 'o' 0x00
> >'2' '.' 0x20 'T' 'e' 'p' 'l' 'o' 't' 'a' 0x00
> >'3' '.' 0x20 'D' 'a' 't' 'u' 'm' '/' 'C' 'a' 's' 0x00
> >*/
> >
> >printf("%s\n",menu[1]); // vytiskne 2. Teplota\n
> >
Vyse vidime, jak jsou ulozeny retezce v pameti, ale ne pole, ktere jste deklaroval (menu)
Polozky tohoto pole NEJSOU retezce uvedene v deklaraci v uvozovkach, jak by se mohlo zdat.
Spravne je, ze pole menu bude ulozeno v pameti takto (jen priklad!!)
0x80484b6 0x80484be 0x80484c9
Jazyk C vlastne retezec jako datovy typ NEMA. Retezcem se v C mysli pole charu.
A "..cokoliv..." je ukazatelem na prvni znak teto retezcove konstanty a je typu char *.
Bohuzel mi pripada, ze jazyk v tomto neni prilis dusledny.
Vyse uvedene totiz tak uplne neplati pri inicializaci retezcovou konstantou pri deklaraci.
V jine zprave nekdo citoval deklaraci:
char name[] = {"Jmeno"};
Kdyz tento zapis vezmu doslova, tak deklaruji pole name a inicializuji ho polozkami,
jejichž vycet je ve slozenych zavorkach. Tam je jen jedna, a tou je ukazatel na retezcovou konstantu "jmeno".
Bohuzel, tak to neni a prekladac deklaraci akceptuje a predpoklada, ze programator
chtel vytvorit pole charu primo obsahujici retezec.
Stejnou funkcionalitu poskytne tento, dle meho nazoru korektnejsi zapis deklarace:
char name[] = "Jmeno";
nebo jeste lepe:
char *name="Jmeno";
Ktery presne reflektuje skutecny datovy typ promenne name.
Zdravi,
fb
Další informace o konferenci Hw-list