Wskaźniki w programowaniu w języku C: czym jest wskaźnik, typy i przykłady

Co to jest wskaźnik w C?

Wskaźnik w C to zmienna przechowująca adres innej zmiennej. Wskaźnik może również służyć do odwoływania się do innej funkcji wskaźnika. Wskaźnik można zwiększać / zmniejszać, tj. Wskazywać na następną / poprzednią lokalizację pamięci. Celem wskaźnika jest oszczędność miejsca w pamięci i szybsze wykonanie.

Jak używać wskaźników w C

Jeśli zadeklarujemy zmienną v typu int, v faktycznie zapisze wartość.

v jest teraz równe zero.

Jednak każda zmienna oprócz wartości ma również swój adres (lub mówiąc po prostu, gdzie znajduje się w pamięci). Adres można pobrać, umieszczając znak ampersand (&) przed nazwą zmiennej.

Jeśli wydrukujesz adres zmiennej na ekranie, będzie wyglądać jak całkowicie losowa liczba (co więcej, może różnić się od run do run).

Spróbujmy tego w praktyce ze wskaźnikiem w C przykład

Wynik tego programu to -480613588.

Co to jest wskaźnik? Zamiast przechowywać wartość, wskaźnik y przechowuje adres zmiennej.

Zmienna wskaźnika

Int * y = & v;

ZMIENNA

POINTER

Wartość przechowywana w nazwanym adresie magazynu / pamięci

Zmienna wskazująca na adres przechowywania / pamięci innej zmiennej

Deklarowanie wskaźnika

Podobnie jak zmienne, wskaźniki w C progra mming muszą zostać zadeklarowane, zanim będzie można ich użyć w programie. Wskaźniki mogą mieć dowolne nazwy, o ile są zgodne z regułami nazewnictwa C. Deklaracja wskaźnika ma następującą postać.

data_type * pointer_variable_name;

Tutaj

  • typ_danych jest podstawowym typem wskaźnika dla typów zmiennych języka C i wskazuje typ zmiennej, na którą wskazuje wskaźnik.
  • Gwiazdka (*: ta sama gwiazdka użyta dla mnożenia), który jest operatorem pośrednim, deklaruje wskaźnik.

Zobaczmy kilka prawidłowych deklaracji wskaźników w tym samouczku dotyczącym wskaźników w języku C:

Zainicjuj wskaźnik

Po zadeklarowaniu wskaźnika inicjalizujemy go jak standardowe zmienne z adresem zmiennej. Jeśli wskaźniki w programowaniu w C nie są niezainicjowane i używane w programie, wyniki są nieprzewidywalne i mogą być katastrofalne.

Aby uzyskać adres zmiennej, używamy operatora ampersand (&), umieszczonego przed nazwą zmiennej, której adresu potrzebujemy. Inicjalizacja wskaźnika odbywa się za pomocą następującej składni.

Składnia wskaźnika

 pointer = &variable; 

Poniżej znajduje się prosty program do ilustracji wskaźników:

Dane wyjściowe:

Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operator Znaczenie
* Służy 2 celom

  1. Deklaracja wskaźnika
  2. Zwraca wartość zmiennej, której dotyczy odwołanie
& Służy tylko do jednego celu

  • Zwraca adres zmiennej

Typy wskaźników w C

Poniżej przedstawiono różne typy wskaźników w języku C:

Wskaźnik zerowy

Możemy utworzyć wskaźnik zerowy, przypisując wartość null podczas deklaracji wskaźnika. Ta metoda jest przydatna, gdy nie masz przypisanego adresu do wskaźnika. Wskaźnik pusty zawsze zawiera wartość 0.

Poniższy program ilustruje użycie wskaźnika pustego:

#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}

Wynik:

The value inside variable p is:0

Void Pointer

W programowaniu w C, void pointer jest również nazywany ogólnym wskaźnikiem. Nie ma żadnego standardowego typu danych. Wskaźnik void jest tworzony za pomocą słowa kluczowego void. Może służyć do przechowywania adresu dowolnej zmiennej.

Poniższy program ilustruje użycie wskaźnika void:

#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}

Wynik:

The size of pointer is:4

Dziki wskaźnik

O wskaźniku mówi się, że jest dzikim wskaźnikiem, jeśli nie jest do niczego inicjalizowany. Tego typu wskaźniki C nie są wydajne, ponieważ mogą wskazywać na nieznane miejsce w pamięci, co może powodować problemy w naszym programie i może prowadzić do awarii programu. Podczas pracy z dzikimi wskazówkami należy zawsze zachować ostrożność.

Poniższy program ilustruje użycie dzikiego wskaźnika:

#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}

Wyjście

timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main

Inne typy wskaźników w „c” są następujące:

  • Wskaźnik wiszący
  • Wskaźnik złożony
  • Wskaźnik bliski
  • Daleki wskaźnik
  • Ogromny wskaźnik

Bezpośrednie i pośrednie wskaźniki dostępu

W języku C istnieją dwa równoważne sposoby aby uzyskać dostęp i manipulować zawartością zmiennej

  • Bezpośredni dostęp: używamy bezpośrednio nazwy zmiennej
  • Pośredni dostęp: używamy wskaźnika do zmiennej

Zrozummy to przy pomocy poniższego programu

Po skompilowaniu programu bez żadnych błędów otrzymamy:

Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48

Arytmetyka wskaźników w C

Operacje na wskaźnikach podsumowano na poniższym rysunku

Operacje wskaźnikowe

Operacja priorytetowa (pierwszeństwo)

Podczas pracy ze wskaźnikami C musimy przestrzegać następujące reguły pierwszeństwa:

Jeśli wskaźnik P wskazuje na zmienną X, wówczas * P może być użyte wszędzie tam, gdzie można zapisać X.

Następujące wyrażenia są równoważne:

W tym drugim przypadku potrzebne są nawiasy: ponieważ operatory jednoargumentowe * i ++ są obliczane od prawej do lewej, bez nawiasów wskaźnik P zostanie zwiększony, a nie obiekt, na który wskazuje P.

Poniższa tabela przedstawia arytmetyczne i podstawowe operacje, których można użyć w przypadku wskaźników C

Operacja Wyjaśnienie
Przydział int * P1, * P2 P1 = P2; P1 i P2 wskazują na tę samą zmienną całkowitą
Inkrementacja i dekrementacja Int * P1; P1 ++; P1–;
Dodanie przesunięcia (stałe) To pozwala wskaźnikowi na przesuwanie N elementów w tabeli. Wskaźnik zostanie zwiększony lub zmniejszony o N razy liczbę bajtów typu zmiennej. P1 + 5;

Wskaźniki C & Tablice z przykładami

Tradycyjnie uzyskać dostęp do elementów tablicy przy użyciu jej indeksu, ale tę metodę można wyeliminować za pomocą wskaźników. Wskaźniki ułatwiają dostęp do każdego elementu tablicy.

Dane wyjściowe

12345

Dodanie określonej liczby do wskaźnika spowoduje przeniesienie położenia wskaźnika do wartości uzyskanej w wyniku operacji dodawania. Załóżmy, że p jest wskaźnikiem, który aktualnie wskazuje na lokalizację pamięci 0, jeśli wykonamy następującą operację dodawania, p + 1, to zostanie wykonana w ten sposób:

Dodawanie / zwiększanie wskaźnika

Ponieważ p wskazuje obecnie lokalizację 0 po dodaniu 1, wartość wyniesie 1, a zatem wskaźnik wskaże lokalizację pamięci 1.

Wskaźniki i ciągi znaków w języku C z przykładami

Łańcuch to tablica obiektów typu char, zakończona znakiem null „\ 0”. Możemy manipulować łańcuchami za pomocą wskaźników. Ten wskaźnik w przykładzie C wyjaśnia tę sekcję

Dane wyjściowe

First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!

Innym sposobem radzenia sobie z ciągami znaków jest tablica wskaźników, jak w poniższym program:

Wynik:

Please remember these materials:ironcoppergold

Zalety wskaźników w C

  • Wskaźniki są przydatne do uzyskiwania dostępu lokalizacje pamięci.
  • Wskaźniki zapewniają skuteczny sposób uzyskiwania dostępu do elementów struktury tablicy.
  • Wskaźniki są używane do dynamicznej alokacji pamięci, jak również jej zwalniania.
  • Wskaźniki służą do tworzenia złożonych struktur danych, takich jak połączona lista, wykres, drzewo itp.

Wady wskaźników w C

  • Wskaźniki są trochę złożone aby zrozumieć.
  • Wskaźniki mogą prowadzić do różnych błędów, takich jak błędy segmentacji, lub mogą uzyskać dostęp do lokalizacji pamięci, która nie jest w ogóle wymagana.
  • Jeśli do wskaźnika zostanie podana nieprawidłowa wartość, może to spowodować uszkodzenie pamięci.
  • Wskaźniki są również odpowiedzialne za wyciek pamięci.
  • Wskaźniki są stosunkowo wolniejsze niż w przypadku zmiennych.
  • Programiści mają duże trudności z pracą ze wskaźnikami; dlatego obowiązkiem programisty jest ostrożne posługiwanie się wskaźnikiem.

Podsumowanie

  • Wskaźnik to nic innego jak miejsce w pamięci, w którym przechowywane są dane.
  • Wskaźnik jest używany do uzyskania dostępu do lokalizacji pamięci.
  • Istnieją różne typy wskaźników, takie jak wskaźnik zerowy, wskaźnik dziki, wskaźnik void i inne typy wskaźników.
  • Wskaźniki mogą być używane z tablicą i ciągiem znaków, aby wydajniej uzyskiwać dostęp do elementów.
  • Możemy tworzyć wskaźniki do funkcji, aby dynamicznie wywoływać funkcję.
  • Operacje arytmetyczne można wykonywać na wskaźniku, który jest znany jako arytmetyka wskaźnika.
  • Wskaźniki mogą również wskazywać na funkcję, która ułatwia wywoływanie różnych funkcji w przypadku definiowania tablicy wskaźników.
  • Jeśli chcesz zajmować się różnymi typami danych zmiennych, możesz użyj wskaźnika void z rzutowania typów.

Write a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *