Wskaźnik jest bardzo ważną koncepcją w języku C, ponieważ wskaźnik daje nam koncepcję adresu w pamięci. Wszystko, co nie jest dostępne dla innych, Pointer może bardzo łatwo uzyskać do tego dostęp za pomocą adresu.
Tutaj omówimy podstawową koncepcję wskaźnika.
Cel:
Głównym celem wskaźnika jest głównie:
Rozszerzona koncepcja wskaźnika:
X | P | Q | R |
---|---|---|---|
1000 | 2000 | 3000 | 4000 |
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #włączać Void main () Int x = 5, *p, ** q, *** r; p = & x; Q = & p; r = & q; ** Q = 7; *** r = 7; |
Wyjaśnienie:
Tutaj P jest wskaźnikiem. Z linii p = & x rozumie się, że p jest wskaźnikiem zawierającym adres x .
** Q jest również jednym rodzajem wskaźnika, którego poziom pośredni wynosi 2, a R jest również wskaźnikiem, którego poziom pośredni wynosi 3. Ile jest * poziomu tego wskaźnika?
Zasada polega na tym, że poziom wskaźnika jest taki, że utrzymuje adres innej zmiennej, której poziom pośredniego jest dokładnie o jedną wskaźnik tego wskaźnika.
Dla tego Q zawiera adres p. P zawiera adres x.
Procedura odczytania linii int x = 5,*p, ** q, *** r;
x jest int. P jest wskaźnikiem do int. Q jest wskaźnikiem do apointer do int. Ile tu tego jest? Mówimy dokładnie tak samo wskaźnik słów. Podobnie jak ** r, oznacza to, że r jest wskaźnikiem, do wskaźnika, do wskaźnika do int.
Jeśli dodamy trochę wartości przy pomocy Q, piszemy
1 | *q = p, *r = q, *p = x; |
Jeśli napiszemy wskaźnik lub * przed zmienną wskaźnika, zamienia się w taką zmienną, która wskazuje na średnią zmienną, blok p.
Wskaźniki arytmetyczne:
Nie możemy dodać mnożenia ani podzielić na dwa adresy (możliwe jest odejmowanie).
Nie możemy pomnożyć liczby całkowitej na adres. Podobnie nie możemy podzielić adresu o wartości całkowitej.
Przykład programowania 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #włączać void main () int a, b; int *p, *q; p = & a; q = & b; printf („ %D”, P + Q); printf („ %d”, p * q); printf („ %D”, P / Q); |
Wyjście:
Wyjaśnienie:
W wyżej wymienionym programie staramy się dodać, pomnożyć i podzielić dwa adresy, pisząc niektóre stwierdzenia.
1 2 3 4 5 | printf („ %D”, P + Q); printf („ %d”, p * q); printf („ %D”, P / Q); |
Ale nie jest to możliwe, jak widać z wyjścia. Wskaźnik nigdy nie daje pozwolenia na dodanie, rozmnażanie się i podzielenie jakiegoś adresu.
Wskaźnik może pozwolić na niektóre obliczenia matematyczne. Są wymienione poniżej:
1 2 3 4 5 6 7 | P = 1000 P + 1 = 1002 P + 4 = 1008 P - 1 = 998 |
P to wskaźnik typu liczb całkowitych 1000 oparty na adresie. Zmienna „A” ma dwa bajty. Adres 1. bajtu wynosi 1001, a adres 2. bajtu wynosi 1002. Jeśli dodamy 1 do wskaźnika, tworzy adres następnego bloku lub następnej zmiennej zamiast adresu następnego bajtu.
1 2 3 4 5 | Wskaźnik + n = wskaźnik + rozmiar (typ wskaźnika) * n = 1000 + 2 * 1 = 1002 |
Możemy odjąć dwa adresy tego samego typu. Wskaźnik na to pozwala.
Przykład programowania 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #włączać void main () int a, b; int *p, *q; p = & a; q = & b; printf („ %d”, p - q); |
Wyjście:
Wyjaśnienie:
Tutaj staramy się odjąć dwa adresy. Na szczęście może wspierać wskaźnik. Nie jest dosłownie odejmowany. Składa się z bloku w zależności od jego rodzaju danych.
Formuła
1 | Wskaźnik 1 - wskaźnik 2 = (literalny odejmowanie) / rozmiar (rodzaj wskaźnika) |
Jeśli jest to typ char, podzielony przez 4.
Jeśli jest to typ pływania, podzielony przez 4.
Jeśli jest to typ int, podzielony przez 2.
Przykład programowania 3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #włączać void swap (int *, int *); int main () int a, b; printf („wprowadź dwie liczby”); Scanf („%d%d”, i a, i b); zamiana (& a, & b); printf ("a = %d b = %d", a, b); void swap (int *x, int *y) int t; t = *x; *x = *y; *y = t; |
Wyjście:
Wyjaśnienie:
Tutaj wskaźnik może przejść przez funkcję. Nazywa się to wywołaniami. Jeśli chcemy zamienić dwie liczby całkowite, przekazując wartości dwóch liczb całkowitych za pomocą funkcji, nie jest to możliwe.
Musimy przekazać adres zmiennej t = & x. Jeśli dodamy * do zmiennej wskaźnika, wówczas * x przekształcił się w taką zmienną, która utrzymuje wartość zmiennej, którą wskazuje zmienną p. Oznacza to t = *x, oznacza, że t utrzymuje wartość pośrednio.
Zadzwoń według referencji:
Zadzwoń według odniesień jest taki sam, jak według adresu. Gdy formalne argumenty są zmiennymi wskaźnikami, nazywa się to odniesieniami.
Odniesienie oznacza adres. Wywołać środki referencyjne, kiedy wywołujemy funkcję, przekazujemy adresy zmiennych, nazywa się to wywołaniem odniesienia.
Ważne pytanie może powstać związane z adresem lub dlaczego używamy adresu (&) w Scanf ()?
Scanf () jest predefiniowaną funkcją w języku c. Main () jest również funkcją w języku c. Używamy scanf () wewnątrz main (). Tak więc, jeśli zadeklarujemy dwie zmienne wewnątrz funkcji Main (), uzyskujemy dostęp do tej zmiennej w scanf (). Nie możemy używać zmiennych funkcji do innej funkcji. Tak więc funkcja scanf () chce przypisać pewną wartość zmienną i zmienną B, wówczas musi znać adres a i b.
W przypadku tego adresu (&) jest używany w Scanf ().
Wniosek:
Możemy znać całą podstawową koncepcję wskaźnika. Z tej dyskusji doszliśmy do tego wniosku, że bez wskaźnika nie możemy wizualizować zarządzania pamięcią w języku C. Adres kontroluje cały schemat zarządzania pamięcią. W tym celu musimy znać pojęcie wskaźnika.