Wskaźnik w języku C jest zmienną przechowującą adres innej zmiennej. Ta zmienna może być typu int, char, tablica, funkcja lub dowolny inny wskaźnik. Rozmiar wskaźnika zależy od architektury. Jednak w architekturze 32-bitowej rozmiar wskaźnika wynosi 2 bajty.
Rozważ następujący przykład, aby zdefiniować wskaźnik przechowujący adres liczby całkowitej.
int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer.
Deklarowanie wskaźnika
Wskaźnik w języku c można zadeklarować za pomocą * (symbol gwiazdki). Nazywa się go również wskaźnikiem pośrednim używanym do dereferencji wskaźnika.
int *a;//pointer to int char *c;//pointer to char
Przykład wskaźnika
Poniżej podano przykład wykorzystania wskaźników do wydrukowania adresu i wartości.
Jak widać na powyższym rysunku, zmienna wskaźnikowa przechowuje adres zmiennej liczbowej, tj. fff4. Wartość zmiennej liczbowej wynosi 50. Adres zmiennej wskaźnikowej p to aaa3.
Za pomocą * ( operator pośredni ), możemy wydrukować wartość zmiennej wskaźnikowej p.
TCP vs udp
Zobaczmy przykład wskaźnika, jak wyjaśniono na powyższym rysunku.
#include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x ',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d ',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; }
Wyjście
Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50
Wskaźnik do tablicy
int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
Wskaźnik do funkcji
void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function
Wskaźnik do struktury
struct st { int i; float f; }ref; struct st *p = &ref;
Zaleta wskaźnika
1) Wskaźnik zmniejsza kod I poprawia wydajność , służy do pobierania ciągów znaków, drzew itp. i jest używany z tablicami, strukturami i funkcjami.
liczba całkowita do podwójnego Java
2) Możemy zwrócić wiele wartości z funkcji za pomocą wskaźnika.
3) Dzięki temu możesz uzyskać dostęp do dowolnego miejsca w pamięci w pamięci komputera.
Użycie wskaźnika
Istnieje wiele zastosowań wskaźników w języku c.
1) Dynamiczna alokacja pamięci
W języku c możemy dynamicznie przydzielać pamięć za pomocą funkcji malloc() i calloc(), w których używany jest wskaźnik.
2) Tablice, funkcje i struktury
Wskaźniki w języku c są szeroko stosowane w tablicach, funkcjach i strukturach. Zmniejsza kod i poprawia wydajność.
Adres (&) operatora
Adres operatora „&” zwraca adres zmiennej. Musimy jednak użyć %u, aby wyświetlić adres zmiennej.
#include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; }
Wyjście
value of number is 50, address of number is fff4
Wskaźnik NULL
Wskaźnik, któremu nie przypisano żadnej wartości oprócz NULL, nazywany jest wskaźnikiem NULL. Jeśli w momencie deklaracji nie masz żadnego adresu do podania we wskaźniku, możesz przypisać wartość NULL. Zapewni to lepsze podejście.
int *p=NULL;
W większości bibliotek wartość wskaźnika wynosi 0 (zero).
szybkie sortowanie
Wskaźnik Program zamieniający dwie liczby bez użycia trzeciej zmiennej.
#include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf(' After swap: *p1=%d *p2=%d',*p1,*p2); return 0; }
Wyjście
Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10
Czytanie złożonych wskaźników
Jest kilka rzeczy, które należy wziąć pod uwagę podczas czytania złożonych wskaźników w C. Przyjrzyjmy się pierwszeństwu i łączności operatorów używanych w odniesieniu do wskaźników.
Operator | Precedens | Łączność |
---|---|---|
(), [] | 1 | Od lewej do prawej |
*, identyfikator | 2 | Od prawej do lewej |
Typ danych | 3 | - |
Musimy tu zauważyć, że
- (): Ten operator jest operatorem nawiasu używanym do deklarowania i definiowania funkcji.
- []: Ten operator jest operatorem indeksu dolnego tablicy
- * : Ten operator jest operatorem wskaźnika.
- Identyfikator: Jest to nazwa wskaźnika. Zawsze będzie przypisany temu priorytet.
- Typ danych: Typ danych to typ zmiennej, na którą ma wskazywać wskaźnik. Zawiera także modyfikator, taki jak Signed int, Long itp.).
Jak czytać wskaźnik: int (*p)[10].
prawidłowe identyfikatory Java
Aby odczytać wskaźnik, musimy zobaczyć, że () i [] mają równy priorytet. Dlatego też należy tutaj uwzględnić ich asocjatywność. Łączność przebiega od lewej do prawej, więc priorytetem jest ().
Wewnątrz nawiasu () operator wskaźnika * i nazwa wskaźnika (identyfikator) p mają ten sam priorytet. Dlatego należy tutaj uwzględnić ich łączność, od prawej do lewej, więc priorytet przechodzi do p, a drugi priorytet do *.
Przypisz trzeci priorytet do [], ponieważ typ danych ma ostatnie pierwszeństwo. Dlatego wskaźnik będzie wyglądał następująco.
- znak -> 4
- * -> 2
- p -> 1
- [10] -> 3
Wskaźnik zostanie odczytany jako p jest wskaźnikiem do tablicy liczb całkowitych o rozmiarze 10.
Przykład
Jak czytać poniższy wskaźnik?
int (*p)(int (*)[2], int (*)void))
Wyjaśnienie
Wskaźnik ten zostanie odczytany jako p jest wskaźnikiem do takiej funkcji, która przyjmuje pierwszy parametr jako wskaźnik do jednowymiarowej tablicy liczb całkowitych o rozmiarze dwa, a drugi parametr jako wskaźnik do funkcji, której parametr jest void i typem zwracanym jest liczba całkowita.