pointers pointer operations c
Intensywne badanie wskaźników i ich zastosowań w C ++.
Wskaźnik to jedna z najpotężniejszych funkcji języka C ++. Wskaźnik pomaga manipulować zmiennymi poprzez jego adres.
Algorytm sortowania przez wybór c ++
W tym samouczku szczegółowo omówimy wszystkie wskaźniki i ich zastosowania w C ++.
=> Obejrzyj serię prostych szkoleń C ++ tutaj.
Czego się nauczysz:
- Co to jest wskaźnik?
- Arytmetyka wskaźników
- Wskaźniki Null And Void
- Tablice i wskaźniki
- Tablica wskaźników
- Wskaźnik wskaźników
- Przekazywanie wskaźników do funkcji
- Wskaźniki funkcji
- Wniosek
- rekomendowane lektury
Co to jest wskaźnik?
Wskaźnik to zmienna, która przechowuje adres miejsca w pamięci. Wiemy, że wszystkie deklarowane przez nas zmienne mają w pamięci określony adres. Deklarujemy zmienną wskaźnikową wskazującą na te adresy w pamięci.
Ogólna składnia deklarowania zmiennej wskaźnikowej to:
datatype * variable_name;
Na przykład, Deklaracja int * ptr;
Oznacza to, że ptr jest wskaźnikiem wskazującym na zmienną typu int. Stąd zmienna wskaźnikowa zawsze zawiera miejsce w pamięci lub adres. Zobaczmy poniżej działanie zmiennych wskaźnikowych.
Rozważmy, że mamy następujące deklaracje:
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
W pamięci te deklaracje zostaną przedstawione w następujący sposób:
To jest wewnętrzna reprezentacja wskaźnika w pamięci. Kiedy przypisujemy zmienną adresową do zmiennej wskaźnika, wskazuje ona na zmienną, jak pokazano na powyższej reprezentacji.
Ponieważ ptr ma adres zmiennej p, * ptr da wartość zmiennej p (zmiennej, na którą wskazuje zmienna wskaźnikowa ptr).
Uwaga: Operator *, którego używamy ze wskaźnikiem, służy do oznaczenia, że jest to zmienna wskaźnikowa.
Przyjrzyjmy się niektórym koncepcjom wskaźników, które są używane w C ++.
Arytmetyka wskaźników
Wiemy, że zmienna wskaźnikowa zawsze wskazuje na adres w pamięci. Wśród operacji, które możemy wykonać, mamy następujące operacje arytmetyczne, które są wykonywane na wskaźnikach.
- Operator przyrostu (++)
- Operator zmniejszania (-)
- Dodawanie (+)
- Odejmowanie (-)
Zobaczmy użycie tych operacji w przykładowym programie.
#include #include using namespace std; int main() { int myarray[5] = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< Wynik:
Pierwszy element w tablicy: 2
następny element w tablicy: 4
następny element w tablicy: 6
następny element w tablicy: 4
następny element w tablicy: 2
Widzieliśmy operacje arytmetyczne wykonywane na wskaźnikach. Zwróć uwagę, że operator inkrementacji ++ zwiększa wskaźnik i wskazuje na następny element w tablicy. Podobnie, operator dekrementacji zmniejsza wskaźnik o 1, tak aby wskazywał na poprzedni element tablicy.
Używamy również operatorów + i -. Najpierw dodaliśmy 1 do zmiennej wskaźnika. Wynik pokazuje, że wskazuje na następny element w tablicy. Podobnie, operator - powoduje, że zmienna wskaźnika wskazuje na poprzedni element tablicy.
Oprócz tych operatorów arytmetycznych możemy również używać operatorów porównania, takich jak ==,.
Wskaźniki Null And Void
Jeśli w przypadku zmiennej wskaźnikowej nie jest przypisany adres zmiennej, dobrą praktyką jest przypisanie wartości NULL zmiennej wskaźnikowej. Zmienna wskaźnikowa o wartości NULL nazywana jest wskaźnikiem NULL.
Wskaźnik pusty to stały wskaźnik z wartością zero zdefiniowaną w nagłówku iostream. Pamięć pod adresem 0 jest zarezerwowana przez system operacyjny i nie możemy uzyskać dostępu do tej lokalizacji.
Używając wskaźnika null, możemy uniknąć niewłaściwego użycia nieużywanych wskaźników i zapobiec przypisywaniu do zmiennych wskaźników niektórych wartości śmieci.
Puste wskaźniki to specjalne wskaźniki wskazujące na wartości bez typu. Wskaźniki pustki są bardziej elastyczne, ponieważ mogą wskazywać na dowolny typ. Ale nie można ich bezpośrednio wyłuskać. W przypadku wyłuskiwania wskaźnik void należy przekształcić we wskaźnik wskazujący na wartość o konkretnym typie danych.
Pokazaliśmy działanie wskaźnika NULL i wskaźnika void w poniższym przykładzie kodu.
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< Wynik:
Wartość wskaźnika NULL: 0
Void pointer vptr wskazuje na: A
Void pointer vptr wskazuje na: 10
W powyższym programie najpierw deklarujemy wskaźnik całkowity, któremu przypisana jest wartość NULL. Kiedy drukujemy ten wskaźnik, widzimy, że wartość wynosi 0, jak omówiliśmy wcześniej.
Następnie deklarujemy void pointer. Najpierw przypisujemy adres zmiennej znakowej do tego pustego wskaźnika. Następnie przypisujemy void pointer do wskaźnika znakowego i typujemy go za pomocą char *. Następnie wypisujemy wartość charptr, która wskazuje na char A, który był zmienną znakową, którą zadeklarowaliśmy wcześniej i jest wskazywany przez wskaźnik void.
Następnie przypisaliśmy zmienną całkowitą do wskaźnika void, a następnie wykonujemy te same kroki, aby wyłuskać ten wskaźnik void przy użyciu wskaźnika całkowitego.
Tablice i wskaźniki
Tablice i wskaźniki są ze sobą silnie powiązane. Wiemy, że nazwa tablicy wskazuje na pierwszy element tablicy i jest to stały wskaźnik.
Możemy przypisać ten wskaźnik do zmiennej wskaźnika, a następnie uzyskać dostęp do tablicy, zmniejszając wskaźnik lub używając operatora indeksu dolnego.
Zobaczymy to powiązanie między zmienną wskaźnika a tablicą w poniższym przykładzie kodu.
#include #include using namespace std; int main() { int myarray[5] = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
Wynik:
1 1 2 3 5
W powyższym programie przypisujemy nazwę tablicy do zmiennej wskaźnikowej. Ponieważ nazwa tablicy wskazuje na pierwszy element tablicy, możemy wydrukować zawartość całej tablicy za pomocą zmiennej wskaźnika i inkrementować ją za pomocą operatora ++. Jest to pokazane na wyjściu.
Tablica wskaźników
Czasami potrzebujemy więcej niż jednej zmiennej wskaźnikowej w programie. Zamiast deklarować każdą indywidualną zmienną wskaźnika, możemy zadeklarować tablicę wskaźników.
Weźmy od razu przykład, aby zademonstrować tablicę wskaźników.
czym są usługi zespołu Visual Studio
#include #include using namespace std; int main() { int myarray[5] = {2,4,6,8,10}; int *ptr[5]; //array of pointers for(int i=0;i<5;i++){ ptr[i] = &myarray[i]; } for (int i = 0; i < 5; i++) { cout << 'Value of myarray[' << i << '] = '; cout << *ptr[i] << endl; } return 0; }
Wynik:
Wartość myarray [0] = 2
Wartość myarray [1] = 4
Wartość myarray [2] = 6
Wartość myarray [3] = 8
Wartość myarray [4] = 10
W oświadczeniu w powyższym
int * ptr [5];
Możemy interpretować jako; ptr to tablica 5 wskaźników całkowitych. Stąd każdy element ptr będzie wskazywał na zmienną typu integer.
Korzystamy z tablicy liczb całkowitych i przypisujemy adres każdego elementu tablicy do każdego z elementów ptr. Następnie wyświetlamy zawartość tablicy ptr, wyświetlając „* ptr [i]”.
Wskaźnik wskaźników
Wskaźnik wskaźników jest niczym innym jak wieloma pośrednimi. To rodzaj łańcucha wskaźników. Kiedy definiujemy wskaźnik wskaźników, pierwszy wskaźnik ma adres drugiego wskaźnika, który z kolei ma adres zmiennej, na którą wskazuje.
W pamięci będzie to przedstawione jako:
Wskaźnik wskaźników jest deklarowany w następujący sposób:
int** intptr;
Bezpośrednio bierzemy przykład kodu, aby lepiej zrozumieć wskaźnik wskaźników.
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< Wynik:
Zmienna zmienna: 10
Wskaźnik do zmiennej: 10
Wskaźnik do wskaźnika do zmiennej: 10
W powyższym programie deklarujemy zmienną całkowitą, wskaźnik całkowity i wskaźnik wskaźnika do liczby całkowitej. Jak pokazano w programie, zmiennej wskaźnikowej przypisywana jest wartość zmiennej. Wskaźnik zmiennej wskaźnikowej ma przypisany adres zmiennej wskaźnikowej.
Na koniec drukujemy trzy zmienne, które wyświetlają tę samą wartość 10 równą zmiennej całkowitej.
Przekazywanie wskaźników do funkcji
Przekazywanie wskaźników do funkcji jest takie samo, jak w przypadku innych technik przekazywania parametrów, w których przekazujemy zmienne wskaźnikowe do funkcji.
Ponownie zajmiemy się zamianą dwóch wartości i zmodyfikujemy ją, aby przekazywała zmienne wskaźnikowe jako parametry.
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< Wynik:
Wprowadź wartości do zamiany: 3 2
a = 3 b = 2
Zamienione wartości
a = 2 b = 3
Jak pokazano w programie, przekazujemy wartości do zamiany jako zmienne całkowite. Parametry formalne są zdefiniowane jako zmienne wskaźnikowe. W rezultacie zmiany dokonane w zmiennych wewnątrz funkcji są również odzwierciedlane na zewnątrz w funkcji wywołującej.
Wskaźniki funkcji
w ten sam sposób, jak mamy wskaźniki do zmiennych, tablic itp., możemy również mieć wskaźniki do funkcji. Różnica polega jednak na tym, że wskaźnik funkcji wskazuje kod wykonywalny, a nie dane, takie jak zmienne lub tablice.
Weźmy przykład, aby zademonstrować wskaźniki funkcji.
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
Wynik:
Wartość a wynosi 100
Jaka jest różnica między zapewnieniem jakości a kontrolą jakości
W powyższym programie mamy funkcję „displayVal”, która po prostu wypisuje przekazaną do niej wartość całkowitą. W funkcji głównej zdefiniowaliśmy wskaźnik funkcji „func_ptr”, który przyjmuje wartość int jako argument i zwraca typ void.
void (* func_ptr) (liczba całkowita)
Uwaga: Musimy umieścić wskaźnik funkcji wewnątrz (). Jeśli go pominiemy, stanie się prototypem funkcji.
Przypisaliśmy adres funkcji „displayVal” do tego wskaźnika funkcji. Następnie za pomocą tego wskaźnika funkcji „func_ptr” przekazujemy wartość argumentu 100, co jest równoważne wywołaniu funkcji displayVal z argumentem 100.
Teraz, jeśli mamy inną funkcję z tym samym prototypem, możemy użyć tego samego wskaźnika funkcji, przypisując jej adres funkcji. Jest to główne zastosowanie wskaźników funkcji.
Wniosek
Chodzi o wskaźniki, definicje i zastosowania w C ++.
W następnym samouczku dowiemy się więcej o odwołaniach w C ++. Odwołania mają również specjalne zastosowanie w C ++ i są często używane jako aliasy dla zmiennych.
=> Kliknij tutaj, aby zapoznać się z serią szkoleń Absolute C ++.
rekomendowane lektury