logo

Wskaźniki C

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.

przykład wskaźnika

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; 
c wskazówki

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.

OperatorPrecedensŁączność
(), []1Od lewej do prawej
*, identyfikator2Od prawej do lewej
Typ danych3-

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.