Dereferointi ja pointteriaritmetiikka
Lue muistia pointtereiden kautta ja käy taulukoita läpi pointteriaritmetiikan avulla.
Dereferointi ja pointteriaritmetiikka on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.
Arvon lukeminen osoittimen kautta
Unaarinen *-operaattori lukee arvon, johon osoitin osoittaa.
int x = 42;
int* p = &x;
std::cout << *p; // 42Arvon kirjoittaminen osoittimen kautta
Voitte käyttää *p-lauseketta myös sijoituksen vasemmalla puolella kirjoittaaksenne kohteeseen.
*p = 100;
std::cout << x; // 100Nuolioperaattori
Rakenne- tai luokkaosoittimille p->member on lyhenne muodosta (*p).member. Käyttäkää nuolta — se on vakiintunut käytäntö.
struct Point { int x, y; };
Point pt{3, 4};
Point* p = &pt;
std::cout << p->x; // 3Osoitinlaskennan perusteet
Osoittimiin voi lisätä kokonaislukuja ja niistä voi vähentää niitä. Tulos liikkuu alkion kokoisina askelina — ei tavuina.
int a[5] = {10, 20, 30, 40, 50};
int* p = a; // points to a[0]
p = p + 2; // now points to a[2]
std::cout << *p; // 30Taulukon läpikäynti
Osoitinlaskenta jäljittelee indeksointia. a[i] ja *(a + i) ovat identtisiä — ja p[i] toimii millä tahansa osoittimella.
int a[] = {1, 2, 3, 4};
int* p = a;
for (int i = 0; i < 4; ++i) {
std::cout << *(p + i) << " ";
}Kahden osoittimen erotus
Saman taulukon sisällä olevien kahden osoittimen vähentäminen antaa alkioiden välisen etäisyyden — tyyppi on std::ptrdiff_t.
int a[5];
int* first = a;
int* last = a + 5;
std::ptrdiff_t len = last - first; // 5Osoittimien vertailu
Osoittimia voi verrata yhtäsuuruuden osalta operaattoreilla == ja != sekä järjestyksen osalta operaattorilla < vain silloin, kun ne osoittavat saman taulukon sisälle.
Iterointi osoittimilla
Idiomattinen C-tyylinen iterointi käyttää kahta osoitinta — alku- ja loppuosoitinta.
int a[] = {1, 2, 3, 4, 5};
for (int* p = a; p != a + 5; ++p) {
std::cout << *p << " ";
}Taulukon lopun yli osoittaminen on sallittua
Voitte laskea osoittimen yhden alkion verran viimeisen alkion jälkeen (”end”-osoitin) — mutta sen kautta ei saa tehdä dereferointia, koska toiminta on määrittelemätöntä.
Osoitinlaskennan sudenkuopat
Yleisiä virheitä:
- Taulukon rajojen ylittäminen
- Osoitintyyppien sekoittaminen (
int*+char*) - Sen unohtaminen, että laskenta tapahtuu alkioyksiköissä eikä tavuissa
Suosikaa iteraattoreita tai alueita
Modernissa C++:ssa suositaan iteraattoreita ja ranges-kirjastoa raakaan osoitinlaskentaan verrattuna. Osoittimet ovat edelleen tärkeitä C-rajapinnoissa ja hyvin matalan tason koodissa.
Pikatarkistus
Jos p on int*, joka osoittaa neljän tavun pituisen int-arvon alkuun, mihin p + 1 osoittaa?
Yhteenveto
*p lukee kohteen tai kirjoittaa siihen. p->member käyttää rakenteen jäsentä. Osoitinlaskenta liikkuu alkion kokoisina askelina. Käyttäkää sitä varoen — iteraattorit ja alueet ovat yleensä turvallisempi valinta modernissa koodissa.
Opi C++ tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 51
- Oppitunnit
- 203
Usein kysytyt kysymykset
Onko oppitunti ”Dereferointi ja pointteriaritmetiikka” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Dereferointi ja pointteriaritmetiikka”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Dereferointi ja pointteriaritmetiikka”?
Lue muistia pointtereiden kautta ja käy taulukoita läpi pointteriaritmetiikan avulla. Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Dereferointi ja pointteriaritmetiikka”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?
Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Raakapointterit ja osoiteoperaattori
- Dereferointi ja pointteriaritmetiikka
- nullptr ja null-pointterien turvallisuus
- Milloin käyttää pointtereita ja milloin viitteitä