Wskaźniki C (z przykładami)

W tym samouczku nauczysz się o wskazówkach; jakie są wskazówki, jak ich używasz i jakie są typowe błędy, które możesz napotkać podczas pracy z nimi przy pomocy przykładów.

Wskaźniki to zaawansowane funkcje programowania w językach C i C ++. Zanim nauczymy się wskaźników, poznajmy adresy w programowaniu w C.

Adres w C

Jeśli masz zmienną var w swoim programie, &varpoda ci jej adres w pamięci.

Używaliśmy adresu wiele razy podczas korzystania z scanf()funkcji.

 scanf("%d", &var);

Tutaj wartość wprowadzona przez użytkownika jest przechowywana w adresie zmiennej var. Weźmy przykład roboczy.

 #include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; ) 

Wynik

 var: 5 adres var: 2686778

Uwaga: po uruchomieniu powyższego kodu prawdopodobnie otrzymasz inny adres.

Wskaźniki C.

Wskaźniki (zmienne wskaźnikowe) to specjalne zmienne używane do przechowywania adresów, a nie wartości.

Składnia wskaźnika

Oto jak możemy zadeklarować wskaźniki.

 int* p;

Tutaj zadeklarowaliśmy wskaźnik p inttypu.

Możesz również deklarować wskaźniki w ten sposób.

 int *p1; int * p2; 

Weźmy inny przykład deklarowania wskaźników.

 int* p1, p2;

Tutaj zadeklarowaliśmy wskaźnik p1 i normalną zmienną p2.

Przypisywanie adresów do wskaźników

Weźmy przykład.

 int* pc, c; c = 5; pc = &c; 

Tutaj 5 jest przypisane do zmiennej c. A adres c jest przypisany do wskaźnika komputera.

Uzyskaj wartość rzeczy wskazywaną przez wskaźniki

Aby uzyskać wartość rzeczy wskazywanej przez wskaźniki, używamy *operatora. Na przykład:

 int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5

Tutaj adres cjest przypisany do wskaźnika komputera. Aby uzyskać wartość zapisaną w tym adresie, użyliśmy * pc.

Uwaga: W powyższym przykładzie pc jest wskaźnikiem, a nie *pc. Nie możesz i nie powinieneś robić czegoś takiego *pc = &c;

Nawiasem mówiąc, *nazywa się operatorem wyłuskiwania (podczas pracy ze wskaźnikami). Działa na wskaźniku i podaje wartość przechowywaną w tym wskaźniku.

Zmiana wartości wskazywanej przez wskaźniki

Weźmy przykład.

 int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1

Przypisaliśmy adres c do wskaźnika komputera.

Następnie zmieniliśmy wartość c na 1. Ponieważ pc i adres c są takie same, *pcdaje nam 1.

Weźmy inny przykład.

 int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1 

Przypisaliśmy adres c do wskaźnika komputera.

Następnie zmieniliśmy *pcna 1 za pomocą *pc = 1;. Ponieważ pc i adres c są takie same, c będzie równe 1.

Weźmy jeszcze jeden przykład.

 int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15

Początkowo adres c jest przypisywany do wskaźnika komputera za pomocą pc = &c;. Ponieważ c wynosi 5, *pcdaje nam 5.

Następnie adres d jest przypisywany do wskaźnika komputera za pomocą pc = &d;. Ponieważ d wynosi -15, *pcdaje nam -15.

Przykład: działanie wskaźników

Weźmy przykład roboczy.

 #include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; ) 

Wynik

 Adres c: 2686784 Wartość c: 22 Adres wskaźnika pc: 2686784 Zawartość wskaźnika pc: 22 Adres wskaźnika pc: 2686784 Zawartość wskaźnika pc: 11 Adres c: 2686784 Wartość c: 2 

Objaśnienie programu

  1. int* pc, c;

    Here, a pointer pc and a normal variable c, both of type int, is created.
    Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.
  2. c = 22;

    This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.
  3. pc = &c;

    This assigns the address of variable c to the pointer pc.
  4. c = 11;

    This assigns 11 to variable c.
  5. *pc = 2;

    This change the value at the memory location pointed by the pointer pc to 2.

Common mistakes when working with pointers

Suppose, you want pointer pc to point to the address of c. Then,

 int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;

Here's an example of pointer syntax beginners often find confusing.

 #include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )

Why didn't we get an error when using int *p = &c;?

It's because

 int *p = &c;

is equivalent to

 int *p: p = &c;

W obu przypadkach tworzymy wskaźnik p(nie *p) i przypisujemy &cdo niego.

Aby uniknąć tego zamieszania, możemy użyć następującego stwierdzenia:

 int* p = &c;

Teraz, gdy wiesz, czym są wskaźniki, w następnym samouczku dowiesz się, w jaki sposób wskaźniki są powiązane z tablicami.

Interesujące artykuły...