C ++

Kaip naudotis C ++ rodyklėmis

Kaip naudotis C ++ rodyklėmis
Kompiuterio atmintis yra ilga ląstelių serija. Kiekvienos ląstelės dydis vadinamas baitu. Baitas yra erdvė, kurią užima abėcėlės angliškas simbolis. Objektas įprasta prasme yra nuoseklus baitų rinkinys atmintyje. Kiekvienas langelis turi adresą, kuris yra sveikas skaičius, paprastai parašytas šešioliktainės formos. Yra trys būdai, kaip pasiekti atmintyje esantį objektą. Prie objekto galima patekti naudojant vadinamąjį rodyklę. Ją galima pasiekti naudojant vadinamąją nuorodą. Jį vis tiek galima pasiekti naudojant identifikatorių. Šiame straipsnyje pagrindinis dėmesys skiriamas nuorodų ir nuorodų naudojimui. C ++ yra smailus objektas ir rodyklės objektas. Smailus daiktas turi dominantį objektą. Rodyklės objektas turi adresą į smailų objektą.

Turite turėti pagrindinių C ++ žinių, įskaitant jos identifikatorius, funkcijas ir masyvus; suprasti šį straipsnį.

Rodyklės objektas ir smailus objektas turi savo identifikatorių.

Operatoriaus adresas ir

Tai unariškas operatorius. Po jo seka identifikatorius, jis grąžina identifikatoriaus objekto adresą. Apsvarstykite šią deklaraciją:

int ptdInt;

Žemiau yra kodas, kuris išreiškia ptdInt nurodytą adresą:

& ptdInt

Koduodami nereikia žinoti tikslaus adreso (numerio).

Netiesioginis operatorius *

Rodyklių kontekste tai yra nevienodas operatorius. Paprastai jis rašomas priešais identifikatorių. Jei naudojamas identifikatoriaus deklaracijoje, identifikatorius yra žymeklio objektas, turintis tik smailaus objekto adresą. Jei kažkas naudojamas prieš žymeklio objekto identifikatorių, norint ką nors grąžinti, tada grąžinamas dalykas yra smailaus objekto vertė.

Kurti žymeklį

Pažvelkite į šį kodo segmentą:

plūdė ptdFloat;
plūdė * ptrFloat;
ptrFoat = &ptdFloat;

Segmentas prasideda smailaus objekto ptdFloat deklaracija. ptdFloat yra identifikatorius, kuris tik identifikuoja plūduriuojantį objektą. Jam galėjo būti priskirtas tikrasis objektas (vertė), tačiau šiuo atveju jam niekas nebuvo priskirtas. Toliau segmente yra rodyklės objekto deklaracija. Netiesioginis operatorius prieš šį identifikatorių reiškia, kad jis turi turėti smailaus objekto adresą. Objekto tipas, plūduriuojantis sakinio pradžioje, reiškia, kad smailus objektas yra plūdė. Žymeklio objektas visada yra to paties tipo kaip smailus objektas. „ptrFoat“ yra identifikatorius, kuris tik identifikuoja žymeklio objektą.

Paskutiniame kodo sakinyje smailaus objekto adresas priskiriamas rodyklės objektui. Atkreipkite dėmesį į operatoriaus adreso ir.

Paskutinis aukščiau pateiktas sakinys (eilutė) rodo, kad deklaravus žymeklio objektą be inicializavimo, jums nereikia nukreipimo operatoriaus, kai turite jį inicializuoti. Tiesą sakant, tai yra sintaksės klaida naudoti netiesioginį operatorių trečioje (paskutinėje) eilutėje.

Viename sakinyje smailus objektas gali deklaruoti ir inicijuoti žymeklio objektą taip:

plūdė ptdFloat;
plūdė * ptrFoat = &ptdFloat;

Pirmoji ankstesnio kodo segmento eilutė ir šis yra tas pats. Antroji ir trečioji ankstesnio kodo segmento eilutės čia buvo sujungtos į vieną teiginį.

Pirmiau pateiktame kode atkreipkite dėmesį, kad deklaruojant ir inicializuojant rodyklės objektą, reikia naudoti nukreipimo operatorių. Tačiau jis nenaudojamas, jei inicijavimą norite atlikti vėliau. Rodyklės objektas inicijuojamas nurodant smailaus objekto adresą.

Šiame kodo segmente nukreipimo operatorius naudojamas grąžinti smailaus objekto turinį.

int ptdInt = 5;
int * ptrInt = &ptdInt;
cout << *ptrInt << '\n';

Išvestis yra 5.

Paskutiniame sakinyje indirection operatorius buvo naudojamas norint grąžinti rodyklės identifikatoriaus nurodytą vertę. Taigi, naudojant deklaracijoje, netiesioginio ryšio operatoriaus identifikatorius turėtų smailaus objekto adresą. Naudojant grąžinimo išraišką kartu su žymeklio identifikatoriumi, netiesioginis operatorius grąžina smailaus objekto vertę.

Nulio priskyrimas žymekliui

Žymeklio objekte visada turėtų būti smailaus objekto tipas. Deklaruojant žymeklio objektą, reikia naudoti smailiojo objekto duomenų tipą. Tačiau dešimtainio nulio reikšmę žymekliui galima priskirti taip, kaip šiame kodo segmente:

int ptdInt = 5;
int * ptrInt;
ptrInt = 0;
arba segmente,
int ptdInt = 5;
int * ptrInt = 0;

Bet kuriuo atveju žymeklis (identifikatorius) vadinamas nuliniu rodikliu; prasme, jis rodo niekur. Tai yra, jis neturi jokio smailaus objekto adreso. Čia 0 yra dešimtainis nulis, o ne šešioliktainis nulis. Šešioliktainis nulis nurodytų pirmąjį kompiuterio atminties adresą.

Nebandykite gauti vertės, kurią nurodo nulinis rodyklė. Jei bandysite tai padaryti, programa gali sukompiliuoti, bet gali jos nevykdyti.

Masyvo vardas kaip nuolatinis žymeklis

Apsvarstykite šį masyvą:

int arr [] = 000, 100, 200, 300, 400;

Masyvo pavadinimas arr yra iš tikrųjų identifikatorius, turintis pirmojo masyvo elemento adresą. Ši išraiška grąžina pirmąją masyvo vertę:

* arr

Naudojant masyvą, prieaugio operatorius ++ elgiasi skirtingai. Užuot pridėjęs 1, žymeklio adresas pakeičiamas kito masyvo elemento adresu. Tačiau masyvo pavadinimas yra pastovus rodyklė; reiškia jo turinys (adresas) negali būti pakeistas ar padidintas. Taigi, norint padidinti, masyvo pradinis adresas turi būti priskirtas nepastoviam rodikliui taip:

int * ptr = arr;

Dabar ptr galima padidinti, kad būtų galima nukreipti į kitą masyvo elementą. ptr čia paskelbtas kaip rodyklės objektas. Be * čia, tai nebūtų rodyklė; identifikatorius būtų laikyti int objektą, o ne atminties adresą.

Šis kodo segmentas galiausiai nurodo ketvirtąjį elementą:

++ptr;
++ptr;
++ptr;

Šis kodas pateikia ketvirtą masyvo vertę:

int arr [] = 000, 100, 200, 300, 400;
int * ptr = arr;
++ptr;
++ptr;
++ptr;
cout << *ptr << '\n';

Išėjimas yra 300.

Funkcijos pavadinimas kaip identifikatorius

Funkcijos pavadinimas yra funkcijos identifikatorius. Apsvarstykite šį funkcijos apibrėžimą:

int fn ()

cout << "seen" << '\n';
grįžti 4;

fn yra funkcijos identifikatorius. Išsireiškimas,

& fn

grąžina atmintyje funkcijos adresą. fn yra kaip smailus objektas. Ši deklaracija skelbia funkcijos rodyklę:

int (* func) ();

Smailaus objekto identifikatorius ir žymeklio objekto identifikatorius skiriasi. func yra funkcijos rodyklė. fn yra funkcijos identifikatorius. Taigi funkciją galima nukreipti į fn taip:

func = &fn;

„Func“ vertė (turinys) yra fn adresas. Du identifikatoriai galėjo būti susieti su inicializavimo sakiniu taip:

int (* func) () = &fn;

Atkreipkite dėmesį į funkcijų rodyklių ir skaliarinių rodyklių tvarkymo skirtumus ir panašumus. func yra funkcijos rodyklė; tai smailus daiktas; jis deklaruojamas kitaip nei skaliarinis rodyklė.

Funkciją galima iškviesti,

fn ()
arba
func ()

Jo negalima iškviesti naudojant * func ().

Kai funkcija turi parametrus, antrose skliaustuose yra parametrų tipai ir nereikia turėti parametrų identifikatorių. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
float fn (float fl, int in)

grįžti fl;

int main ()

plūdė (* func) (plūdė, int) = &fn;
plūdė val = func (2.5, 6);
cout << val << '\n';
grąžinti 0;

Išvestis yra 2.5.

C ++ nuoroda

Nuorodos C ++ yra tik būdas sukurti identifikatoriaus sinonimą (kitą pavadinimą). Jis naudoja & operatorių, bet ne taip, kaip ir naudojamas rodyklėms. Apsvarstykite šį kodo segmentą:

int myInt = 8;
int & yourInt = myInt;
cout << myInt << '\n';
cout << yourInt << '\n';

Rezultatas yra:

8
8

Pirmasis sakinys inicijuoja identifikatorių „myInt“; i.e. „myInt“ yra deklaruojamas ir verčiamas laikyti,. Antrasis teiginys sukuria naują identifikatorių „yourInt“ - „myInt“ sinonimą. Norėdami tai pasiekti, & operatorius deklaracijoje įrašomas tarp duomenų tipo ir naujo identifikatoriaus. „Cout“ teiginiai rodo, kad du identifikatoriai yra sinonimai. Norėdami grąžinti vertę šiuo atveju, prieš ją nereikia rašyti * . Tiesiog naudokitės identifikatoriumi.

myInt ir yourInt čia nėra du skirtingi objektai. Jie yra du skirtingi identifikatoriai, nurodantys (identifikuojantys) tą pačią atminties vietą, kurios vertė yra 8. Pakeitus „myInt“ vertę, „yourInt“ vertė taip pat pasikeis automatiškai. Pakeitus „yourInt“ vertę, „myInt“ vertė taip pat pasikeis automatiškai.

Nuorodos yra to paties tipo.

Nuoroda į funkciją

Kaip galite turėti nuorodą į skaliarą, taip pat galite turėti nuorodą į funkciją. Tačiau nuorodos į funkciją kodavimas skiriasi nuo nuorodos į skaliarą. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
float fn (float fl, int in)

grįžti fl;

int main ()

plūdė (& func) (plūdė, int) = fn;
plūdė val = func (2.5, 6);
cout << val << '\n';
grąžinti 0;

Išvestis yra 2.5.

Atkreipkite dėmesį į pagrindinės funkcijos pirmąjį teiginį, kuris funkciją paverčia fn sinonimu. Abu nurodo tą pačią funkciją. Atkreipkite dėmesį į vienkartinį ir. Taigi čia yra etaloninis operatorius, o ne operatoriaus adresas. Norėdami iškviesti funkciją, tiesiog naudokite bet kurį pavadinimą.

Nuorodos identifikatorius nėra tas pats, kas žymeklio identifikatorius.

Funkcija grąžinti žymeklį

Šioje programoje funkcija grąžina žymeklį, kuris yra smailaus objekto adresas:

# įtraukti
naudojant vardų sritį std;
plūdė * fn (plūdinė fl, int į)

plūdė * fll = &fl;
grįžti fll;

int main ()

plūdė * val = fn (2.5, 6);
cout << *val << '\n';
grąžinti 0;

Išvestis yra 2.5

Pirmasis funkcijos sakinys fn () yra skirtas tik žymeklio objektui sukurti. Funkcijos paraše atkreipkite dėmesį į vienkartinį ir * padėtį. Taip pat atkreipkite dėmesį, kaip rodyklę (adresą) pagrindinėje () funkcijoje priėmė kitas rodyklės objektas.

Funkcija, grąžinanti nuorodą

Šioje programoje funkcija pateikia nuorodą:

# įtraukti
naudojant vardų sritį std;
float & fn (float fl, int in)

plūduriuoti & frr = fl;
grįžti frr;

int main ()

plūdė & val = fn (2.5, 6);
cout << val << '\n';
grąžinti 0;

Išvestis yra 2.5.

Pirmasis funkcijos sakinys fn () yra skirtas tik nuorodai sukurti. Funkcijos paraše atkreipkite dėmesį į vienkartinį naudojimą ir padėtį. Taip pat atkreipkite dėmesį, kaip nuorodą pagrindinėje () funkcijoje gavo kita nuoroda.

Rodyklės perdavimas funkcijai

Šioje programoje rodyklė, kuri iš tikrųjų yra plūduriuojančio smailaus objekto adresas, kaip argumentas siunčiamas funkcijai:

# įtraukti
naudojant vardų sritį std;
plūdė fn (plūdė * fl, int į)

grįžti * fl;

int main ()

plūdė v = 2.5;
plūdė val = fn (& v, 6);
cout << val << '\n';
grąžinti 0;

Išvestis yra 2.5

Funkcijos paraše atkreipkite dėmesį į „float“ parametro naudojimą ir padėtį *. Kai tik pradedama vertinti fn () funkcija, pateikiamas toks teiginys:

plūdė * fl = & v;

Ir fl, ir v rodo į tą patį smailų objektą, kuriame telpa 2.5. * fl grąžinimo ataskaitoje nėra deklaracija; tai reiškia smailaus objekto vertę, į kurią nukreipia rodyklės objektas.

Funkcijos nuorodos perdavimas

Šioje programoje nuoroda į funkciją siunčiama kaip argumentas:

# įtraukti
naudojant vardų sritį std;
plūdė fn (plūdė ir fl, int į)

grįžti fl;

int main ()

plūdė v = 2.5;
plūdė val = fn (v, 6);
cout << val << '\n';
grąžinti 0;

Išvestis yra 2.5

Funkcijos paraše atkreipkite dėmesį į „float“ parametro naudojimą ir padėtį. Kai tik pradedama vertinti fn () funkcija, pateikiamas toks teiginys:

plūduriuoti & fl = v;

Masyvo perdavimas funkcijai

Ši programa parodo, kaip perduoti masyvą funkcijai:

# įtraukti
naudojant vardų sritį std;
int fn (int arra [])

grąžinti tuo [2];

int main ()

int arr [] = 000, 100, 200, 300, 400;
int val = fn (arr);
cout << val << '\n';
grąžinti 0;

Išėjimas yra 200.

Šioje programoje yra perduotas masyvas. Atkreipkite dėmesį, kad funkcijos parašo parametras turi tuščią masyvo deklaraciją. Funkcijos iškvietimo argumentas yra tik sukurto masyvo pavadinimas.

Ar funkcija C ++ gali grąžinti masyvą?

Funkcija C ++ gali grąžinti masyvo vertę, bet negali grąžinti masyvo. Kompiliuojant šią programą gaunamas klaidos pranešimas:

# įtraukti
naudojant vardų sritį std;
int fn (int arra [])

grįžti tuo;

int main ()

int arr [] = 000, 100, 200, 300, 400;
int val = fn (arr);
grąžinti 0;

Pointer of Pointer

Rodyklė gali nukreipti į kitą rodyklę. Tai yra, žymeklio objektas gali turėti kito žymiklio objekto adresą. Jie vis tiek turi būti to paties tipo. Tai iliustruoja šis kodo segmentas:

int ptdInt = 5;
int * ptrInt = &ptdInt;
int ** ptrptrInt = &ptrInt;
cout << **ptrptrInt << '\n';

Išvestis yra 5.

Deklaracijos „pointer to pointer“ deklaracijoje naudojamas dvigubas *. Norint grąžinti paskutinio smailaus objekto vertę, vis tiek naudojama dviguba *.

Rodyklių masyvas

Ši programa parodo, kaip koduoti rodyklių masyvą:

# įtraukti
naudojant vardų sritį std;
int main ()

int num0 = 000, num1 = 100, num2 = 200, num3 = 300, num4 = 400;
int * no0 = & num0, * no1 = & num1, * no2 = & num2, * no3 = & num3, * no4 =&num4;
int * arr [] = ne0, ne1, ne2, ne3, ne4;
cout << *arr[4] << '\n';
grąžinti 0;

Rezultatas yra:

400

Masyvo deklaracijoje atkreipkite dėmesį į * vartojimą ir padėtį. Atkreipkite dėmesį į * naudojimą grąžinant masyvo vertę. Su rodyklių rodyklėmis dalyvauja du *. Rodyklių masyvo atveju jau pasirūpinta vienu *, nes masyvo identifikatorius yra rodyklė.

Kintamo ilgio stygų masyvas

Stygos literalas yra konstanta, kuri grąžina žymeklį. Kintamo ilgio eilučių masyvas yra rodyklių masyvas. Kiekviena masyvo reikšmė yra rodyklė. Žymekliai yra adresai atminties vietoms ir yra vienodo dydžio. Skirtingo ilgio eilutės yra kitur atmintyje, o ne masyve. Ši programa iliustruoja naudojimą:

# įtraukti
naudojant vardų sritį std;
int main ()

const char * arr [] = "moteris", "berniukas", "mergaitė", "suaugęs";
cout << arr[2] << '\n';
grąžinti 0;

Rezultatas yra „mergina“.

Masyvo deklaravimas prasideda rezervuotu žodžiu „konst“ pastoviam; po kurio rašoma „char“, tada žvaigždutė *, nurodant, kad kiekvienas elementas yra žymeklis. Norėdami grąžinti eilutę iš masyvo, * nenaudojama dėl numanomo kiekvienos eilutės žymeklio pobūdžio. Jei naudojamas *, tada bus grąžintas pirmasis eilutės elementas.

Žymeklis funkcijai grąžinti žymeklį

Ši programa iliustruoja, kaip užkoduotas žymeklis į funkciją, grąžinančią rodyklę:

# įtraukti
naudojant vardų sritį std;
int * fn ()

int skaičius = 4;
int * inter = #
grįžti inter;

int main ()

int * (* func) () = &fn;
int val = * func ();
cout << val << '\n';
grąžinti 0;

Išvestis yra 4.

Žymeklio deklaravimas funkcijai, grąžinančiai žymeklį, yra panašus į žymeklio deklaravimą į įprastą funkciją, tačiau prieš jį pažymėta žvaigždutė. Pirmasis pagrindinės () funkcijos teiginys tai iliustruoja. Norėdami iškviesti funkciją naudodami žymeklį, prieš tai pažymėkite *.

Išvada

Norėdami sukurti rodyklę į skaliarą, atlikite kažką panašaus,

plūduriuojantis smailus;
plūduriuojantis * rodyklė = &pointed;

* turi dvi reikšmes: deklaracijoje jis nurodo rodyklę; norint ką nors grąžinti, tai yra už smailaus objekto vertę.

Masyvo pavadinimas yra pastovus rodiklis į pirmąjį masyvo elementą.

Norėdami tai padaryti, galite sukurti funkcijos žymeklį,

int (* func) () = &fn;

kur fn () yra funkcija, apibrėžta kitur, o func yra rodyklė.

& turi dvi reikšmes: deklaracijoje jis nurodo nuorodą (sinonimą) į tą patį objektą kaip ir kitą identifikatorių; ką nors grąžinant, tai reiškia adresą.

Norėdami sukurti nuorodą į funkciją, galite tai padaryti,

plūdė (& refFunc) (plūdė, int) = fn;

kur fn () yra funkcija, apibrėžta kitur, o refFunc yra nuoroda.

Kai funkcija grąžina žymeklį, grąžintą vertę turi gauti rodyklė. Kai funkcija grąžina nuorodą, grąžintą vertę turi gauti nuoroda.

Perduodant žymeklį funkcijai, parametras yra deklaracija, o argumentas - smailaus objekto adresas. Perduodant nuorodą į funkciją, parametras yra deklaracija, o argumentas yra nuoroda.

Perduodant masyvą funkcijai, parametras yra deklaracija, o argumentas yra masyvo pavadinimas be []. C ++ funkcija masyvo negrąžina.

Jei reikia, žymikliui į rodyklę reikalingi du *, o ne vienas.

Chrys

Nemokami ir atvirojo kodo žaidimų varikliai, skirti kurti „Linux“ žaidimus
Šiame straipsnyje bus pateiktas nemokamų ir atvirojo kodo žaidimų variklių, kurie gali būti naudojami kuriant 2D ir 3D žaidimus „Linux“, sąrašas. Toki...
„Tomb Raider for Linux“ pamoka
„Tomb Raider“ šešėlis yra dvyliktas „Tomb Raider“ serijos priedas - veiksmo ir nuotykių žaidimų franšizė, sukurta „Eidos Montreal“. Žaidimą kritikai i...
Kaip padidinti FPS sistemoje „Linux“?
FPS reiškia Kadrai per sekundę. FPS užduotis yra išmatuoti kadrų greitį atkuriant vaizdo įrašus ar žaidimus. Paprastais žodžiais, nepertraukiamų viso ...