Lekcje modułu (2/2)
Wskaźniki
Wskaźniki (pointers) to jedna z najpotężniejszych i najbardziej charakterystycznych cech języka C++. Pozwalają na bezpośredni dostęp do fizycznej pamięci komputera, co umożliwia wydajne zarządzanie zasobami i wysoką wydajność.
1. Czym jest pamięć i adres?
Każda zmienna deklarowana w programie jest przechowywana w komórce pamięci RAM. Każda komórka ma unikalny adres pamięci (zazwyczaj wyrażany w formacie szesnastkowym, np. 0x7ffee3bf87ac).
C++ pozwala nam uzyskać adres pamięci dowolnej zmiennej za pomocą operatora adresu &:
int x = 42;
std::cout << &x; // Stampa l'indirizzo di memoria di x (es. 0x7ffee3bf87ac)
2. Definicja wskaźnika
Wskaźnik to specjalna zmienna, która przechowuje jako swoją wartość adres pamięci innej zmiennej.
Składnia wymaga użycia gwiazdki * po typie danych:
int x = 42;
int* ptr = &x; // ptr è un puntatore a intero che contiene l'indirizzo di x
3. Operator wyłuskania (dereferencji) (*)
Aby uzyskać dostęp do wartości zapisanej pod adresem wskazywanym przez wskaźnik lub ją zmodyfikować, używamy operatora wyłuskania (lub dereferencji), również reprezentowanego przez symbol *:
int x = 42;
int* ptr = &x;
std::cout << *ptr; // Stampa 42 (il valore a cui punta ptr)
*ptr = 100; // Modifica il valore di x tramite il puntatore
std::cout << x; // Ora stampa 100!
4. Wskaźniki puste: nullptr
Wskaźnik, który nie wskazuje na żaden prawidłowy adres, musi zostać zainicjalizowany słowem kluczowym nullptr (wprowadzonym w C++11):
int* ptr = nullptr; // Puntatore nullo e sicuro
Spróbuj sam
W funkcji main znajduje się zmienna value zainicjalizowana na wartość 42. Zadeklaruj wskaźnik do liczby całkowitej ptr wskazujący na adres value. Użyj wyłuskania wskaźnika ptr, aby ustawić wartość value na 100, a na koniec wypisz value za pomocą std::cout.
Pokaż wskazówkę
Zadeklaruj wskaźnik za pomocą `int* ptr = &value;`, zmodyfikuj wartość wyłuskując go `*ptr = 100;`i wypisz za pomocą`std::cout << value;`.
Rozwiązanie dostępne po 3 próbach
Zdefiniuj funkcję doubleValue przyjmującą wskaźnik do liczby całkowitej (int* ptr) i mnożącą przez 2 wartość, na którą wskazuje (jeśli wskaźnik nie jest pusty). W main wywołaj doubleValue przekazując jej adres zmiennej num, a następnie ją wypisz.
Pokaż wskazówkę
Funkcja musi przyjmować `int* ptr`. Wewnątrz użyj `*ptr = (_ptr) _ 2`. W main wywołaj ją za pomocą `doubleValue(&num);`.
Rozwiązanie dostępne po 3 próbach
Na podstawie przedstawionego kodu, które wyrażenie pozwala bezpośrednio zmodyfikować wartość zmiennej a, ustawiając ją na 10?
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?