Osutajad on paljude C-programmide jaoks üliolulised, kuid neid võib olla raske mõista. Vaadake praktiliste näidete abil üle nende süntaks ja nende tööpõhimõte.

Osutajad on C-programmeerimise oluline aspekt, mida vajate keele tõhusaks kasutamiseks hästi. Need aitavad tõhusalt hallata mälu, edastada andmeid viite alusel, käsitleda massiive ja stringe ning palju muud. Kuid vigade vältimiseks tuleb neid hoolikalt kasutada.

Avastage C-osutite üksikasju, alates mälu ja aadresside mõistmisest kuni osuti aritmeetika valdamiseni.

Mälu ja aadressid

Mälu – kasutatakse sageli lühendina RAM (muutmälu)— on arvuti salvestusruum, mis sisaldab andmeid ja juhiseid, mida programm vajab. See toimib teie programmi tööruumina. Väikseim mäluühik on tavaliselt bait, mis võrdub kaheksa bitiga.

Igal mälukohal on kordumatu aadress ja see võib sõltuvalt arvutist salvestada erineva hulga andmeid. Kui deklareerite muutuja C-s, määrate sellele kaudselt mälukoha andmete salvestamiseks. Mõelge sellele nagu majale, millel on ainulaadne aadress, mida saate selle asukoha leidmiseks kasutada.

Kujutage ette, et teie arvuti mälu on salvestusrakkude jada, millest igaüks sisaldab baiti andmeid. Oletame, et on kaks muutujat, x ja y, C-programmis:

int x = 5;
int y = 10;

Mälu järgi võib see välja näha selline:

Aadress

Andmed

1000

5

1004

10

Siin salvestavad need muutujad eraldi mälukohtadesse. Andmed, mis x tähistab asub mäluaadressil 1000, while yandmed hõivavad mäluaadressi 1004.

Mälu ja aadresside mõistmine on osutitega töötamisel ülioluline, kuna need on muutujad, mis salvestavad mäluaadresse. Need võimaldavad teil juurde pääseda kindlasse mälukohta salvestatud andmetele ja nendega manipuleerida.

Osutite deklareerimine ja initsialiseerimine C-s

Enne kui saate C-s viiteid kasutades andmeid muuta, peate need deklareerima ja lähtestama.

Deklaratsioon

Kursori deklareerimiseks määrate andmetüübi, millele see osutab, millele järgneb tärn (*) ja seejärel kursori nimi. Näiteks:

int *ptr;

Siin int *ptr kuulutab osuti nimega ptr mis suudab salvestada täisarvu mäluaadressi.

Initsialiseerimine

Pärast deklareerimist peaksite selle initsialiseerima mäluaadressiga, millele see osutab. Saate selle lähtestada järgmiselt:

int x = 5;
int *ptr = &x;

Selles deklaratsioonis on & operaator hangib muutuja x aadressi. Kood ütleb sisuliselt: "ptr on muutuja, see salvestab täisarvu väärtuse mälu asukoha ja see asukoht on kõikjal, kus x praegu viitab."

Nüüd ptr sisaldab täisarvulise muutuja aadressi x. Näiteks:

Muutuv

Aadress

Väärtus

x

1000

5

ptr

1000

Osutajad C-s ei salvesta mitte ainult muutuja aadressi, vaid neil on ka oma kordumatu aadress arvuti mälus.

Osutite viitamise tühistamine

C-kursori viitamise tühistamine tähendab juurdepääsu väärtusele, mis on salvestatud kursoriga näidatud mäluaadressil.

Oletame, et teil on osuti, int *ptr, mis osutab täisarvulisele muutujale ja selle muutuja väärtus on 10. Väärtuse juurde pääsemiseks kursori kaudu kasutage tärni (*) operaator:

int x = 10;

int *ptr = &x; // ptr points to the address of x

int value = *ptr; // Dereferencing ptr to get the value

See näide kasutab ptr muutuja väärtuse hankimiseks mäluaadressil, millele see viitab. Niisiis, väärtus omab nüüd väärtust 10, mis on sisu x.

Osuti aritmeetika

Osuti aritmeetika on C-s võimas funktsioon, mis on eriti kasulik massiivide ja stringidega (mis on märgimassiivid) töötamiseks. See võimaldab teil mälus liikumiseks osutitega aritmeetilisi toiminguid teha.

Siin on näide, mis näitab, kuidas saate seda kasutada.

Alustage täisarvude massiivi deklareerimisest:

int numbers[] = {10, 20, 30};

Deklareerige kursor int-le ja määrake sellele numbrimassiivi mälukoht:

int *ptr = numbers;

Te ei pea siin kasutama operaatorit "&", kuna numbrid on juba vaikimisi kursori tüüp.

Muutuja ptr osutab nüüd massiivi esimesele elemendile:

printf("%d\n", *ptr); // 10

Saate liigutada kursorit massiivi kolmandale elemendile, suurendades seda 2 võrra:

ptr += 2;
printf("%d\n", *ptr); // 30

Kursorit saab tagasi liigutada, lahutades sellest:

ptr--;
printf("%d\n", *ptr); ;// 20

Osuti aritmeetika on eriti kasulik massiivides navigeerimiseks ja dünaamilise mälujaotusega töötamiseks.

Osutajad ja funktsioonid C-s

Kui sa mõista, kuidas funktsioonid C-programmeerimises töötavad, siis olete funktsiooniosutajate kasutamisega hästi hakkama saanud. Siin on mõned viisid, kuidas neid kasutada.

Funktsiooniosutajad

Funktsioonide dünaamiliseks kasutamiseks saate deklareerida ja kasutada funktsiooniosutajaid, nagu mis tahes muid väärtusi. See on eriti kasulik tagasihelistamisel ja dünaamiliste funktsioonide täitmisel.

int (*operation)(int, int); // Declare a function pointer
operation = add; // Pointer to an add function
int result = operation(5, 3); // Call the function through the pointer

See kood deklareerib funktsiooniosuti nimega operatsiooni mis võib osutada funktsioonile, mis võtab kaks täisarvu ja tagastab ühe. See määrab (osuti) lisama funktsiooniks operatsiooni. Seejärel kasutab see kaudseks helistamiseks operatsioonimuutujat lisa (5, 3).

Möödumine viitest

Osutajad võimaldavad teil funktsioonidele viidates argumente edastada, võimaldades teil funktsiooni algandmeid muuta. See on ülioluline funktsioonide puhul, mis peavad muutma muutuja väärtust väljaspool oma ulatust.

voidmodifyValue(int *x){
*x = 42; // Modifies the value of x in the calling code
}

The modifyValue Funktsioon muudab mis tahes argumendi väärtust, mille kutsuv kood talle annab, seades selle väärtuseks 42.

Dünaamiline mälu eraldamine

Funktsioonid võivad viidad tagasi dünaamiliselt eraldatud mällu. See on tavaline, kui peate looma ja tagastama piiramata andmestruktuure, näiteks massiive või lingitud loendeid. Teil on vaja omama hästi pinu ja hunniku mälu seda kasutada.

int *createArray(intsize){
int *arr = (int *)malloc(size * sizeof(int));
return arr;
}

See kood määratleb funktsiooni, luuaArray, see võtab täisarvu, suurus, sisendiks. Funktsiooni sees eraldab see dünaamiliselt mälu määratud suurusega täisarvu massiivi jaoks malloc. Pärast massiivi lähtestamist tagastab see kursori sellele vastloodud massiivile.

Ühised kasutusalad

Osutajad on C-s olulised mitmel põhjusel ja just need on eristab C-d teistest programmeerimiskeeltest, näiteks Pythonist. Siin on mõned levinumad kasutusviisid.

  • Dünaamiline mälu eraldamine
  • Massiivi manipuleerimine
  • Möödumine viitest
  • Andmestruktuurid
  • Ressursihaldus

Osutite tavapäraste kasutusviiside mõistmine võib parandada teie C-programmeerimise oskusi. Harjutage mõnda neist, et näpunäiteid paremini mõista.

Harjutage osutite kasutamist C-programmeerimises

Osutajate valdamine C-programmeerimises on väärtuslik oskus, mis võimaldab teil tõhusalt hallata mälu, töödelda andmeid ja teha täpsemaid toiminguid. Osutajatega harjutamine ja oskused parandavad oluliselt teie võimet luua tugevaid ja ressursitõhusaid C-programme.