Wskaźniki C ++ z przykładami

Spisie treści:

Anonim

Co to są wskaźniki?

W C ++ wskaźnik odnosi się do zmiennej, która przechowuje adres innej zmiennej. Podobnie jak zwykłe zmienne, wskaźniki mają typ danych. Na przykład wskaźnik typu integer może zawierać adres zmiennej typu integer. Wskaźnik typu znakowego może zawierać adres zmiennej typu znakowego.

Powinieneś zobaczyć wskaźnik jako symboliczną reprezentację adresu pamięci. Dzięki wskaźnikom programy mogą symulować wywołanie przez odniesienie. Mogą również tworzyć i manipulować dynamicznymi strukturami danych. W C ++ zmienna wskaźnikowa odnosi się do zmiennej wskazującej określony adres w pamięci wskazywanej przez inną zmienną.

W tym samouczku C ++ nauczysz się:

  • Co to są wskaźniki?
  • Adresy w C ++
  • Składnia deklaracji wskaźnika
  • Operator odniesienia (&) i operator deference (*)
  • Wskaźniki i tablice
  • Wskaźnik NULL
  • Wskaźniki zmiennych
  • Zastosowanie wskaźników
  • Zalety używania wskaźników

Adresy w C ++

Aby zrozumieć wskaźniki C ++, musisz zrozumieć, w jaki sposób komputery przechowują dane.

Kiedy tworzysz zmienną w swoim programie w C ++, przypisywana jest jej trochę miejsca w pamięci komputera. Wartość tej zmiennej jest przechowywana w przypisanej lokalizacji.

Aby poznać lokalizację w pamięci komputera, w której przechowywane są dane, C ++ udostępnia operator & (odniesienie). Operator zwraca adres zajmowany przez zmienną.

Na przykład, jeśli x jest zmienną, & x zwraca adres zmiennej.

Składnia deklaracji wskaźnika

Deklaracja C ++ przyjmuje następującą składnię:

datatype *variable_name;
  • Typ danych to podstawowy typ wskaźnika, który musi być prawidłowym typem danych C ++.
  • Nazwa_zmiennej to powinna być nazwą zmiennej wskaźnika.
  • Gwiazdka używana powyżej do deklaracji wskaźnika jest podobna do gwiazdki używanej do wykonywania operacji mnożenia. To gwiazdka oznacza zmienną jako wskaźnik.

Oto przykład prawidłowych deklaracji wskaźników w C ++:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

Operator odniesienia (&) i operator deference (*)

Operator odwołania (&) zwraca adres zmiennej.

Operator wyłuskiwania (*) pomaga nam uzyskać wartość, która została zapisana w adresie pamięci.

Na przykład:

Jeśli mamy zmienną o nazwie num, zapisujemy pod adresem 0x234 i przechowujemy wartość 28.

Operator odniesienia (&) zwróci 0x234.

Operator wyłuskiwania (*) zwróci 5.

Przykład 1:

#include using namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}

Wynik:

Jak to działa:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Zaimportuj plik nagłówkowy iostream. Pozwoli nam to korzystać z funkcji zdefiniowanych w pliku nagłówkowym bez otrzymywania błędów.
  2. Uwzględnij przestrzeń nazw std, aby używać jej klas bez wywoływania jej.
  3. Wywołaj funkcję main (). Logikę programu należy dodać w treści tej funkcji. {Oznacza początek treści funkcji.
  4. Zadeklaruj zmienną całkowitą x i przypisz jej wartość 27.
  5. Zadeklaruj zmienną wskaźnikową * ip.
  6. Przechowuj adres zmiennej x w zmiennej wskaźnikowej.
  7. Wydrukuj tekst na konsoli.
  8. Wydrukuj wartość zmiennej x na ekranie.
  9. Wydrukuj tekst na konsoli.
  10. Wydrukuj adres zmiennej x. Wartość adresu została zapisana w zmiennej ip.
  11. Wydrukuj tekst na konsoli.
  12. Wydrukuj wartość przechowywaną pod adresem wskaźnika.
  13. Program powinien zwrócić wartość po pomyślnym wykonaniu.
  14. Koniec treści funkcji main ().

Wskaźniki i tablice

Tablice i wskaźniki działają w oparciu o pokrewną koncepcję. Podczas pracy z tablicami zawierającymi wskaźniki należy zwrócić uwagę na różne kwestie. Sama nazwa tablicy oznacza adres bazowy tablicy. Oznacza to, że aby przypisać adres tablicy do wskaźnika, nie należy używać znaku ampersand (&).

Na przykład:

p = arr;

Powyższe jest poprawne, ponieważ arr reprezentuje adres tablic. Oto kolejny przykład:

p = &arr;

Powyższe jest nieprawidłowe.

Możemy niejawnie przekonwertować tablicę na wskaźnik. Na przykład:

int arr [20];int * ip;

Poniżej znajduje się ważna operacja:

ip = arr;

Po powyższej deklaracji ip i arr będą równoważne i będą miały wspólne właściwości. Można jednak przypisać inny adres do ip, ale nie możemy przypisać niczego do arr.

Przykład 2:

Ten przykład pokazuje, jak przechodzić przez tablicę przy użyciu wskaźników:

#include using namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}

Wynik:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Zadeklaruj zmienną IP będącą wskaźnikiem liczby całkowitej.
  2. Zadeklaruj tablicę o nazwie arr i zapisz w niej 6 liczb całkowitych.
  3. Przypisz arr do ip. IP i arr staną się równoważne.
  4. Utwórz pętlę for. Zmienna pętli x została utworzona w celu iteracji po elementach tablicy od indeksu od 0 do 5.
  5. Wydrukuj wartości przechowywane pod adresem wskaźnika IP. Jedna wartość zostanie zwrócona w każdej iteracji, a łącznie zostanie wykonanych 6 powtórzeń. Endl to słowo kluczowe C ++, które oznacza linię końcową. Ta akcja umożliwia przeniesienie kursora do następnego wiersza po wydrukowaniu każdej wartości. Każda wartość zostanie wydrukowana w osobnym wierszu.
  6. Aby przenieść wskaźnik do następnej pozycji int po każdej iteracji.
  7. Koniec pętli for.
  8. Program musi coś zwrócić po pomyślnym wykonaniu.
  9. Koniec treści funkcji main ().

Wskaźnik NULL

Jeśli nie ma dokładnego adresu, który ma zostać przypisany, zmiennej wskaźnikowej można przypisać wartość NULL. Należy to zrobić podczas deklaracji. Taki wskaźnik jest nazywany wskaźnikiem zerowym. Jego wartość wynosi zero i jest zdefiniowana w wielu standardowych bibliotekach, takich jak iostream.

Przykład 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

Wynik:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Zadeklaruj zmienną wskaźnikową ip i przypisz jej wartość NULL.
  2. Wyświetla wartość zmiennej wskaźnika ip obok tekstu na konsoli.
  3. Program musi zwrócić wartość po pomyślnym zakończeniu.
  4. Koniec treści funkcji main ().

Wskaźniki zmiennych

Dzięki C ++ możesz manipulować danymi bezpośrednio z pamięci komputera.

Przestrzeń pamięci można przypisać lub ponownie przydzielić zgodnie z życzeniem. Jest to możliwe dzięki zmiennym wskaźnikowym.

Zmienne wskaźnikowe wskazują określony adres w pamięci komputera wskazywany przez inną zmienną.

Można to zadeklarować w następujący sposób:

int *p;

Lub,

int* p;

W przykładzie you zadeklarowaliśmy zmienną wskaźnikową p.

Będzie zawierał adres pamięci.

Gwiazdka jest operatorem wyłuskiwania, który oznacza wskaźnik do.

Wskaźnik p wskazuje wartość całkowitą w adresie pamięci.

Przykład 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

Wynik:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Zadeklaruj zmienną wskaźnikową p i zmienną x o wartości 30.
  2. Przypisz adres zmiennej x do p.
  3. Wydrukuj wartość zmiennej wskaźnika p obok tekstu na konsoli.
  4. Program musi zwrócić wartość po pomyślnym zakończeniu.
  5. Koniec treści funkcji main ().

Zastosowanie wskaźników

Funkcje w C ++ mogą zwracać tylko jedną wartość. Ponadto wszystkie zmienne zadeklarowane w funkcji są alokowane na stosie wywołań funkcji. Gdy funkcja powróci, wszystkie zmienne stosu są niszczone.

Argumenty funkcji są przekazywane przez wartość, a żadna modyfikacja zmiennych nie zmienia wartości rzeczywistych przekazywanych zmiennych. Poniższy przykład pomaga zilustrować tę koncepcję: -

Przykład 5:

#include using namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}

Wynik:

Oto zrzut ekranu kodu:

Objaśnienie kodu:

  1. Utwórz prototyp funkcji o nazwie test, która będzie przyjmować dwa parametry całkowite.
  2. Wywołaj funkcję main (). Dodamy logikę programu do jego treści.
  3. Zadeklaruj dwie zmienne całkowite a i b, każda o wartości 5.
  4. Wydrukuj tekst na konsoli. Endl (end line) przesunie kursor, aby rozpocząć drukowanie w następnej linii.
  5. Wydrukuj wartość zmiennej a na konsoli obok innego tekstu. Endl (end line) przesunie kursor, aby rozpocząć drukowanie w następnej linii.
  6. Wydrukuj wartość zmiennej b na konsoli obok innego tekstu. Endl (end line) przesunie kursor, aby rozpocząć drukowanie w następnej linii.
  7. Utwórz funkcję o nazwie test (), która jako parametry przyjmuje adresy zmiennych a i b.
  8. Wydrukuj tekst na konsoli. \ N utworzy nową pustą linię przed wydrukowaniem tekstu. Endl (end line) przesunie kursor, aby rozpocząć drukowanie w następnej linii po wydrukowaniu tekstu.
  9. Wydrukuj wartość zmiennej a na konsoli obok innego tekstu. Endl (end line) przesunie kursor, aby rozpocząć drukowanie w następnej linii.
  10. Wydrukuj wartość zmiennej b na konsoli obok innego tekstu. Endl (end line) przesunie kursor, aby rozpocząć drukowanie w następnej linii.
  11. Program musi zwrócić wartość po pomyślnym zakończeniu.
  12. Koniec treści funkcji main ().
  13. Definiowanie funkcji test (). Funkcja powinna pobierać dwie zmienne wskaźnikowe w postaci liczb całkowitych * n1 i * n2.
  14. Przypisanie zmiennej wskaźnikowej * n1 wartości 10.
  15. Przypisanie zmiennej wskaźnikowej * n2 wartości 11.
  16. Koniec treści funkcji test ().

Mimo że nowe wartości są przypisywane do zmiennych a i b wewnątrz testu funkcji, po zakończeniu wywołania funkcji to samo nie jest odzwierciedlane w zewnętrznej funkcji main.

Używanie wskaźników jako argumentów funkcji pomaga przekazać rzeczywisty adres zmiennej w funkcji, a wszystkie zmiany dokonane na zmiennej zostaną odzwierciedlone w funkcji zewnętrznej.

W powyższym przypadku funkcja „test” ma adres zmiennych „a” i „b”. Te dwie zmienne są bezpośrednio dostępne z funkcji „test”, a zatem wszelkie zmiany wprowadzone w tych zmiennych są odzwierciedlane w funkcji wywołującej „main”.

Zalety używania wskaźników

Oto zalety / zalety używania wskaźników

  • Wskaźniki to zmienne przechowujące adresy innych zmiennych w C ++.
  • Funkcja wykorzystująca wskaźniki może modyfikować i zwracać więcej niż jedną zmienną.
  • Pamięć można przydzielać i usuwać dynamicznie za pomocą wskaźników.
  • Wskaźniki pomagają uprościć złożoność programu.
  • Szybkość wykonywania programu poprawia się dzięki zastosowaniu wskaźników.

Podsumowanie:

  • Wskaźnik odnosi się do zmiennej przechowującej adres innej zmiennej.
  • Każdy wskaźnik ma prawidłowy typ danych.
  • Wskaźnik jest symboliczną reprezentacją adresu pamięci.
  • Wskaźniki pozwalają programom symulować wywołanie przez odniesienie oraz tworzyć i manipulować dynamicznymi strukturami danych.
  • Tablice i wskaźniki używają podobnej koncepcji.
  • Nazwa tablicy oznacza podstawę tablicy.
  • Jeśli chcesz przypisać adres tablicy do wskaźnika, nie używaj znaku ampersand (&).
  • Jeśli nie ma określonego adresu do przypisania zmiennej wskaźnika, przypisz jej wartość NULL.