Podstawy C++ [MK, 18/19]
Lekcja 9. Funkcje w C++   Funkcje matematyczne...

Wskaźniki

Definicja wskaźnika

Wskaźnik jest to zmienna w programie, która nie przechowuje wartości, ale adres w pamięci, gdzie ta wartość się znajduje.

Jak wiadomo, cały kod programu oraz wartości zmiennych użytych w programie, są przechowywane w pamięci komputera. Z kolei pamięć komputerowa składa się z rekordów, a każdy rekord posiada swój unikalny adres (numer). Kiedy procesor chce odczytać wartość jakiejś zmiennej zapisanej w programie, to robi to odczytując wartość komórki pamięci gdzie ta zmienna jest przechowywana.

Tworzenie wskaźników w języku C++ odbywa się za pomocą gwiazdki *. Tworząc nowy wskaźnik najlepiej jest mu od razu przypisać pustą wartość. Unikniemy w ten sposób przechowywania we wskaźniku przypadkowej wartości. W przypadku wskaźników będzie to zawartość przypadkowej komórki pamięci. Tworzenie i inicjowanie wskaźników zerem:

int *wskaznik1 = 0;
double *wskaznik2 = NULL;

Z kolei odczytywanie wskaźnika, a więc odczytywanie adresu, odbywa się poprzez & (ampersand). Przykład tworzenia i odczytywania wskaźników:

#include <iostream>
 
int main()
{
    int x = 5;
    std::cout << x << '\n'; // wypisz wartość zmiennej x
    std::cout << &x << '\n'; // wypisz adres pamięci, gdzie jest zapisana zmienna x
 
    return 0;
}

Powyższy kod zwróci dwie liczby. Pierwsza to zawsze będzie liczba 5, natomiast druga liczba to adres pamięci gdzie znajduje się zmienna 5, a więc na każdym komputerze będzie to inna wartość. Należy również pamiętać, że adres komórki pamięci jest podawany w postaci liczby szesnastkowej poprzedzonej prefiksem 0x. Przykładowo liczba szesnastkowa 0x6dfefc jest równa liczbie dziesiętnej 7 208 700.

Jeśli wskaźniki przechowują adres w pamięci, gdzie znajduje się wartość zmiennej, to czy to oznacza, że wszystkie wskaźniki mają typ całkowity bez znaku? Odpowiedź na to pytanie jest krótka: nie. Wskaźnik musi mieć taki sam typ jak zmienna, na którą wskazuje. Przeanalizujmy poniższy kod:

int zmiennaInt = 5; // deklaracje zmiennych
double zmiennaDouble= 7.0;
 
int *wskaznikNaInt = &zmiennaInt; // deklaracje wskaźników i przypisaniem im wartości
double *wskaznikNaDouble = &zmiennaDouble;

int *wskaznikNaInt2 = &zmiennaDouble; // źle
double *wskaznikNaDouble2 = &zmiennaInt ; // źle 

Dwie pierwsze linie deklarują zmienne typu int i double, dwie kolejne deklarują wskaźniki na te zmienne. Z kolei w dwóch ostatnich liniach próbujemy przypisać wskaźnikowi na zmienną całkowitą adres zmiennej typu double i na odwrót. Taka operacja jest niemożliwa.

Wskaźniki jako argumenty funkcji

Przekazując wskaźnik jako argument funkcji powodujemy, że zmiana wartości zmiennej wskazywanej przez ten wskaźnik wewnątrz funkcji, spowoduje zmianę wartości zmiennej poza funkcją. Przykład:

#include<iostream>
using namespace std;

void zamien(int *a, int *b)
{
    int pom = *a;
    *a = *b;
    *b = pom;
}
int main()
{
    int a, b;
    cout << "Podaj liczbę a: ";
    cin >> a;
    cout << "Podaj liczbę b: ";
    cin >> b;
    zamien(&a, &b); //do funkcji przekazujemy adresy zmiennych
    cout << "Liczby a i b zostały zamienione: a = " << a << ", b = " << b;
    return 0;
}

Tablice wskaźników

Dozwolone jest również tworzenie tablic wskaźnikowych zawierających adresy komórek pamięci.

#include <iostream>

using namespace std;
const int MAX = 3;

int main () {
   int  tab[MAX] = {10, 100, 200};
   int *ptr[MAX];

   for (int i = 0; i < MAX; i++) {
      ptr[i] = &tab[i];
   }

   for (int i = 0; i < MAX; i++) {
      cout << "Wartosc tab[" << i << "]\t= " << *ptr[i] << endl;
      cout << "Adres tab[" << i << "]\t= " << &ptr[i] << endl;
   }

   return 0;
}

Zadania

Zadanie 1. #
Napisz w języku C++ program tworzący tablicę wskaźników składająca się z 6 wyrazów: Wlazł, kotek, na, płotek, i, mruga. Następnie wypisz te wyrazy i podaj adres komórki pamięci, w której każdy w nich się znajduje. Przykładowy wynik działania programu:
Słowo 'Wlazł' znajduje się w komórce pamięci pod adresem 0x6dfed0

2019-01-02 12:41:37 2020-04-27 11:48:56


© 2024 Młody Informatyk v. 0.1.7717