Menu
Coddy logo textTech

Wskaźniki i referencje

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 13 z 104.

Skoro rozumiesz już pamięć stosu i sterty, poznajmy narzędzia, które pozwalają bezpośrednio pracować z lokalizacjami w pamięci: wskaźniki i referencje.

Wskaźnik przechowuje adres pamięci innej zmiennej. Deklarujesz go za pomocą *, a adres uzyskujesz za pomocą &.

int value = 42;
int* ptr = &value;    // ptr przechowuje adres value

std::cout << ptr;     // Wypisuje adres w pamięci
std::cout << *ptr;    // Dereferencja: wypisuje 42

Referencja jest aliasem istniejącej zmiennej. Po powiązaniu zawsze odnosi się do tej zmiennej. Deklarujesz ją za pomocą &.

int value = 42;
int& ref = value;     // ref jest aliasem dla value

ref = 100;            // Zmienia value na 100
std::cout << value;   // Wypisuje 100

Najważniejsze różnice:

WskaźnikiReferencje
Mogą mieć wartość nullMuszą zostać zainicjalizowane
Można je przypisać ponownieNie można ich ponownie powiązać
Użyj *, aby uzyskać dostęp do wartościDostęp do wartości bezpośrednio
Mogą wskazywać na nicZawsze prawidłowe

Oba są niezbędne do wydajnego przekazywania obiektów do funkcji bez kopiowania oraz do pracy z pamięcią przydzieloną na stercie. Referencje są bezpieczniejsze i prostsze, natomiast wskaźniki oferują większą elastyczność, gdy trzeba przypisać im nową wartość lub sprawdzić, czy są null.

challenge icon

Wyzwanie

Łatwy

Zbudujmy prosty system modyfikowania wartości, który pokaże, jak wskaźniki i referencje działają inaczej podczas modyfikowania danych.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • ValueOps.h: Zdefiniuj trzy funkcje, które modyfikują wartości całkowite na różne sposoby:
    • doubleByPointer(int* ptr): przyjmuje wskaźnik i podwaja wartość, na którą on wskazuje
    • tripleByReference(int& ref): przyjmuje referencję i potraja wartość
    • swapValues(int* a, int* b): przyjmuje dwa wskaźniki i zamienia miejscami wartości, na które wskazują
  • main.cpp: Wczytaj dwie liczby całkowite, a następnie pokaż działanie wskaźników i referencji:
    • Wypisz oryginalne wartości: "Original: <first> <second>"
    • Użyj doubleByPointer dla pierwszej wartości, a następnie wypisz: "After double: <first>"
    • Użyj tripleByReference dla drugiej wartości, a następnie wypisz: "After triple: <second>"
    • Użyj swapValues, aby zamienić miejscami obie wartości, a następnie wypisz: "After swap: <first> <second>"

Wywołując funkcje ze wskaźnikami, pamiętaj, aby użyć operatora pobrania adresu (&) i przekazać adres zmiennej. Referencje działają bardziej naturalnie — wystarczy przekazać zmienną bezpośrednio.

Dołącz plik nagłówkowy w main.cpp za pomocą #include "ValueOps.h".

Spróbuj swoich sił

#include <iostream>
#include "ValueOps.h"
using namespace std;

int main() {
    // Wczytaj dwie liczby całkowite z wejścia
    int first, second;
    cin >> first;
    cin >> second;
    
    // Wypisz pierwotne wartości
    cout << "Original: " << first << " " << second << endl;
    
    // TODO: Użyj doubleByPointer dla pierwszej wartości (przekaż adres za pomocą &)
    
    // TODO: Wypisz wartości po podwojeniu
    
    // TODO: Użyj tripleByReference dla drugiej wartości (przekaż zmienną bezpośrednio)
    
    // TODO: Wypisz wartości po potrojeniu
    
    // TODO: Użyj swapValues, aby zamienić obie wartości miejscami (przekaż adresy za pomocą &)
    
    // TODO: Wypisz wartości po zamianie miejscami
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online