problem v C - retezec vs ukazatel
Oldrich Kepka
hw
Středa Březen 17 12:04:59 CET 2004
Tez zdravim :-))
> 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.
Mno, nevim presne o co vam jde, ale v tomto pripade memnu je pole ukazatelu
(tj. je treba jednoduche dereference, abychom se dostali k ukazateli na
char, tj. v tomto pripade ke stringu). Nic min, ni vic. Je to korektni a
pouziva se to tak.
> 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 *.
ano
> 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".
V tomto pripade se vezme ona "konstanta" jako prave to pole znaku, takze
predhozi zapis chape prekladac jako
char name[] = { 'J', 'm', 'e', 'n', 'o', '\0' };
samozrejme zapis
char name[] = { "Jmeno0", "Jmeno1" };
je blbost.
Jinak tomu {...} se rika aggregate.
> Bohuzel, tak to neni a prekladac deklaraci akceptuje a predpoklada, ze
programator
> chtel vytvorit pole charu primo obsahujici retezec.
To je ale spravne.
> Stejnou funkcionalitu poskytne tento, dle meho nazoru korektnejsi zapis
deklarace:
> char name[] = "Jmeno";
> nebo jeste lepe:
> char *name="Jmeno";
Nechapu roc jeste lepe.
> Ktery presne reflektuje skutecny datovy typ promenne name.
-Olda
Další informace o konferenci Hw-list