Laboratórium 6

Ukazovatele nám umožňujú reprezentovať zložité dátové typy (štruktúry), upravovať hodnoty odosielané ako parametre funkcie, pracovať s dynamicky alokovanými oblasťami pamäte alebo efektívnejšie pristupovať k tabuľkám. Ukazovateľ nám poskytuje prostriedky na nepriamy prístup k hodnote typu dátumu.

laboratórium

Ukazovateľ je v skutočnosti hodnota. Je to hodnota adresy pamäte, kde je to, čo nás skutočne zaujíma. Ukazovatele môžu byť typu blízkeho (majú iba hodnotu posunutia) alebo typu svetlometu (majú tiež segmentové a posunuté).

deklaruje celé číslo a ktorá má hodnotu 10 a volá sa celočíselný ukazovateľ int_p. * predchádza definícii ukazovateľa ukazovateľa. Na vytvorenie spojenia medzi a a int_p Používa sa predpona.

Týmto sa priradí hodnota adresy (adresa pamäte) premennej a ukazovateľ. Odteraz int_p bude obsahovať adresu oblasti pamäte, kde je umiestnená hodnota 10, hodnota premennej a.

BODY OBSAHUJÚ PAMÄTOVÉ ADRESY !

Odkázať na jeho hodnotu a použijeme '*':

Táto operácia priradí hodnotu z adresy pamäte, na ktorú ukazuje int_p premennej x.

Prenos odkazom na parametre funkcie

Aritmetické operácie povolené na ukazovateľoch sú sčítanie/odčítanie konštanty, zvyšovanie/znižovanie a odčítanie dvoch ukazovateľov rovnakého typu.

Pridanie 1 spôsobí, že ukazovateľ smeruje na ďalší objekt rovnakého typu, a zmenšenie spôsobí, že smeruje na bezprostredne predchádzajúci objekt v pamäťovom priestore.

pi ++ - pi bude ukazovať na ďalšie celé číslo. Čo sa vlastne odčíta alebo pripočíta, je sizeof (type).

Dôležitosť ukazovateľov je možné zmeniť explicitnou konverziou typu cudný.* ((Char *) pf) poskytne prvý bajt reprezentácie premennej typu plavák.

Ukazovateľ 0 je preddefinovaný ako NULOVÝ a znamená to, že to nič neznamená.

Pretože neplatné * znamená nešpecifikovaný ukazovateľ, nemôžeme s týmito ukazovateľmi vykonávať aritmetické operácie. Ukazovatele neplatnosti nám umožňujú udržiavať všeobecnosti programu na maximum.

poklesla dvoch ukazovateľov je povolený iba pre ukazovatele rovnakého typu. p-q predstavuje počet objektov medzi a q. Ukazovatele a obrazy

* str bude ukazovať na prvý prvok poľa z.

Tu sú dva spôsoby, ako vypočítať dĺžku reťazca:

Poznámka Pozor na inicializácie, ako napríklad:

Zatiaľ čo prvý správne inicializuje premennú a alokuje potrebný priestor, druhá inštrukcia vyhradí pamäťový priestor pre reťazcovú konštantu „abcd“ a priradí adresu ukazovateľu . Dynamická alokácia

DYNAMICKÉ ROZDELENIE PAMÄTI (MALLOC, CALLOC, VEĽKOSTI, ZADARMO)
Na rezervovanie priestoru pre premenné sa odporúča dynamické priradenie. Je veľmi ťažké vopred vedieť, koľko údajov program spracuje. Statická alokácia poľa spôsobí buď stratený priestor pamäte RAM (dosť drahý priestor) pri prideľovaní množstva výrazne nad potreby, alebo k výskytu chýb, keď je množstvo pridelenej pamäte oveľa nižšie ako sú potrebné. Statická alokácia sa vykonáva v dátovej oblasti programu počas generovania objektového obrazu programu.

Je oveľa lepšie prideliť priestor podľa potreby (ak je to možné - množstvo požadovanej pamäte by nemalo byť väčšie, ako je k dispozícii).

Jazyk C umožňuje programátorom dynamicky alokovať a uvoľňovať oblasti pamäte, keď je program spustený. Funkcia, ktorá vyhradzuje pamäť pre premennú, je calloc (). Vyžaduje sa tiež použitie veľkosť () ktorá určuje potrebnú pamäť. Zadarmo () uvoľní pridelenú pamäť. Ukazovatele na funkcie

Je možné vyhlásiť ukazovateľ smerujúci na a funkcie. Deklarácia takéhoto ukazovateľa sa vykonáva takto:

Zátvorky okolo * func_p sú povinné, inak kompilátor bude chápať deklaráciu ako deklaráciu funkcie, ktorá vráti ukazovateľ na celé číslo. Pri prideľovaní adresy funkcii ukazovateľa postupujeme takto:

kde knieža je názov funkcie. Volanie funkcie sa robí nasledovne (pokiaľ nemáme parametre):

Ak funkcia vráti hodnotu, máme: Argumenty príkazového riadku

Po spustení je možné poslať argumenty do programu v jazyku C. Zátvorky nasledujúce po hlavnej funkcii slúžia na tento účel. argc obsahuje počet znovu prijatých argumentov argv [] je to pole ukazovateľov, z ktorých každý obsahuje argument.

Poznač si to * Argv [0] obsahuje názov volaného programu a* Argv [1] je ukazovateľ na prvý odovzdaný argument a * Argv [n] označuje posledný argument. Ak nemáme argument, argc bude mať hodnotu 1 a pre n argumentov argc sa bude rovnať n + 1. Vyriešené problémy
Navrhované problémy