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