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