Мазмунга өтүү

Шилтемелер жана динамикалык эстутум

Программалоо C++ Татаалдыгы 1/5

Сабактын башталышы

Шилтемелер жана динамикалык эстутум

Өзгөрмөгө экинчи ат бер, анын дарегин сакта жана эстутумду акылдуу карызга ал

Негизги идея: Шилтеме — бул мурунтан бар өзгөрмөнүн экинчи аты. Көрсөткүч — бул башка өзгөрмөнүн дарегин сактаган өзгөрмө. Стек — тез, автоматтык эстутум; үймөк — new аркылуу сурап алган жана delete аркылуу кайтарууга милдеттүү болгон кошумча эстутум.
Сабактын аягында сен:
  • шилтемени көрсөткүчтөн айырмалай аласың,
  • стек менен үймөк кайда жайгашканын түшүндүрө аласың,
  • new жана delete аркылуу үймөктөгү эстутумду агып кетпей бөлүп жана бошото аласың.

1. Шилтеме — экинчи ат

Шилтеме — бул мурунтан бар өзгөрмөнүн дагы бир аты (псевдоним). Аны жарыялоодо & белгиси менен түзөсүң. Андан кийин шилтеме менен түпнуска — эстутумдагы бир эле уяча: бирин өзгөртсөң, экинчиси да өзгөрөт.

Салыштыруу: сенин атың Александр, бирок үйдө сени «Саша» дешет — эки ат тең бир адамды көрсөтөт. Сашаны тамактандырсаң, Александр да ач эмес, себеби бул бир эле адам.

#include <iostream>
using namespace std;

int main() {
    int score = 10;
    int& alias = score;       // alias is a SECOND name for score

    alias = 25;                // changing alias changes score
    cout << score << endl;   // 25
    return 0;
}

Күтүлгөн натыйжа: 25. alias — scoreтун экинчи аты болгондуктан, бирине жазуу экөөнө тең жазат. Шилтемеге түзүлгөндө эмнеге шилтегенин сөзсүз берүү керек, кийин аны башка өзгөрмөгө буруп болбойт.

2. Көрсөткүч даректи сактайт

Көрсөткүч — бул мааниси башка өзгөрмөнүн эстутумдагы дареги болгон өзгөрмө. Ал * менен жарыяланат, ал эми даректи & дарек операторунун жардамы менен алат. Ошол даректеги маанини алуу үчүн көрсөткүчтү ачасың, дагы * менен.

Салыштыруу: көрсөткүч — досуңдун үйүнүн дареги жазылган чаптама сыяктуу. Чаптама үй эмес, бирок дарек боюнча үйгө барып, ичиндеги эмеректи да которо аласың.

#include <iostream>
using namespace std;

int main() {
    int n = 42;
    int* p = &n;      // p holds the ADDRESS of n

    cout << n  << endl;   // 42
    cout << *p << endl;   // 42  (value at that address)

    *p = 100;              // change n THROUGH the pointer
    cout << n  << endl;   // 100
    return 0;
}

Күтүлгөн натыйжа: 42, анан 42, анан 100. Бул жерде &n «n дареги» дегенди, *p «p ичиндеги даректеги маани» дегенди билдирет. Шилтемеден айырмаланып, көрсөткүч бош болушу (nullptr) жана кийин башка өзгөрмөгө көрсөтүшү мүмкүн.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө