C pointre

Programovacie jazyky, rady, poradňa...
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

C pointre

Príspevok od používateľa marek788 »

Ahojte, chcem sa spytat na par veci. Ak pouzivam nejake pole charov, a potrebujem ho pouzit vo funkcii, tak ak chapem spravne potrebujem to spravit nejak takto

Kód: Vybrať všetko

void funkcia(char* foo)
a bez pointrov to nepojde. Je to spravne? Natrafil som niekde aj na definovanie funkcie nejak takto

Kód: Vybrať všetko

void *funkcia(...)
Co znamena ta hviezdicka pred nazvom funkcie?

Dalej by som sa chcel spytat, ma nejaky vyznam ak pracujem so stringami (ten narozdiel od charu ide poslat ako argument aj normalne), posielat ako argument pointer na neho alebo nieco ine? Videl som

Kód: Vybrať všetko

(string const& foo)
no neviem, ci to ma v praxi nejaky zmysel, napr pri setreni pamati a pod.

Dakujem velmi pekne. :)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C pointre

Príspevok od používateľa BX »

1. Pole v C je vždy pointer. Pole ako také nie je samostatný prvok, vždy ho musíš zapísať ako "ukazateľ na prvý prvok poľa". Takže áno, keď ho predávaš do funkcie, musíš predať "ukazateľ na prvý prvok poľa" - a to je tá premenná typu ukazateľ (char*).

2.

Kód: Vybrať všetko

void *funkcia(...)
znamená, že funkcia vracia "nejakú adresu", alebo inak "nejaký pointer". void znamená to "nejaký" - void je žiadny/nedefinovaný typ a hviezdička znamená pointer.
Ak by si napísal toto

Kód: Vybrať všetko

char *funkcia(...)
, tak funkcia vracia práve to pole ukazateľov z prvého bodu (resp ten ukazateľ na prvý prvok poľa).

3. Typ string a znak & sú už vecou C++ (pokiaľ viem, C ich stále nemá, ale môžem sa mýliť). Znak & je referencia - povedzme že taký jednoduchší pointer a typ string zapuzdruje pole charov.

Kód: Vybrať všetko

funkcia (string foo)
Toto znamená, že do funkcie predávaš string bežným spôsobom - celá premenná sa musí skopírovať a predať do funkcie. To očividne zaberie ďalšie miesto a kopírovanie môže aj nejakú dobu trvať.

Kód: Vybrať všetko

funkcia (string & foo)
Toto znamená, že do funkcie predávaš string ako referenciu - čiže premenná sa nemusí kopírovať, ale pracuje sa rovno s tou "vonku" (čiže ak aj premennú vo funkcii zmeníš, prejaví sa to rovno aj mimo funkciu).

Kód: Vybrať všetko

funkcia (string const& foo)
No a toto je "bezpečné" predanie premennej cez referenciu - const zaručí, že premenná sa vo funkcii môže len čítať, nie meniť (takže si ju nemôžeš napr. náhodou prepísať a za funkciou sa čudovať, že ti niečo nefunguje...)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8215
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C pointre

Príspevok od používateľa harrison314 »

jazyk C nema string ani referencie takze

Kód: Vybrať všetko

(string const& foo)
je z C++
ado130
Expert
Expert
Používateľov profilový obrázok
Príspevky: 163
Registrovaný: 01 aug 2012, 12:36

Re: C pointre

Príspevok od používateľa ado130 »

Cčko aké také snáď má * (dereferenciu) a & (referenciu).
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8215
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C pointre

Príspevok od používateľa harrison314 »

ado130 napísal:Cčko aké také snáď má * (dereferenciu) a & (referenciu).
Ano ale & nemozes pouzit v hlavicke funkcie.
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: C pointre

Príspevok od používateľa marek788 »

Dakujem za vysvetlenie. Ospravedlnujem sa za neskoru odpoved, no chcel by som sa este spytat na jednu vec. Stringy riesim v arduine, a tie tam funguju. Co ma vsak zaujima je, ze preco pri predani premennej (string foo) mi vysledny program zaberie rovnako vela pamata v arduine, ako pri predani (string & foo). Cakal som, ze pri tej druhej alternative tu bude menej, kedze sa nemusi premenna kopirovat. Alebo mi nieco uslo? Dakujem este raz.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8215
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C pointre

Príspevok od používateľa harrison314 »

Pravdepodobne pre to, ze stringy su interne implementovane tak, ze v kopirovacom konstruktore sa nekopiruje obsah stringu, ale len referencia nan. Vtedy ked ho zmenis az vtedy sa nakopiruje ako samostatny string.
A aj kompilator by mal vediet taketo veci optimalizovat.
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: C pointre

Príspevok od používateľa marek788 »

Aha, to by davalo zmysel. Dakujem teda za vysvetlenie. :)
Napísať odpoveď