Ukazatele C (s příklady)

V tomto kurzu se dozvíte o ukazatelích; co jsou ukazatele, jak je používáte a běžné chyby, se kterými se můžete setkat při práci s nimi pomocí příkladů.

Ukazatele jsou výkonné funkce programování v C a C ++. Než se naučíme ukazatele, pojďme se dozvědět více o adresách v programování C.

Adresa v C

Pokud máte ve svém programu proměnnou var, &vardá vám její adresu do paměti.

Při používání této scanf()funkce jsme použili adresu několikrát .

 scanf("%d", &var);

Zde je hodnota zadaná uživatelem uložena na adresu proměnné var. Vezměme si funkční příklad.

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

Výstup

 var: 5 adresa var: 2686778

Poznámka: Při spuštění výše uvedeného kódu pravděpodobně dostanete jinou adresu.

Ukazatele C.

Ukazatele (proměnné ukazatele) jsou speciální proměnné, které se používají k ukládání adres, nikoli hodnot.

Syntaxe ukazatele

Zde můžeme deklarovat ukazatele.

 int* p;

Zde jsme deklarovali ukazatel p inttypu.

Ukazatele můžete také deklarovat těmito způsoby.

 int *p1; int * p2; 

Vezměme si další příklad deklarování ukazatelů.

 int* p1, p2;

Zde jsme deklarovali ukazatel p1 a normální proměnnou p2.

Přiřazení adres ukazatelům

Vezměme si příklad.

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

Zde je 5 přiřazeno proměnné c. A adresa c je přiřazena ukazateli pc.

Získejte hodnotu věci, kterou ukazují ukazatele

K získání hodnoty věci, na kterou ukazují ukazatele, používáme *operátor. Například:

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

Zde je adresa cpočítače přiřazena ukazateli počítače. K získání hodnoty uložené na této adrese jsme použili * pc.

Poznámka: Ve výše uvedeném příkladu je pc ukazatel, nikoli *pc. Nemůžete a neměli byste dělat něco jako *pc = &c;

Mimochodem, *nazývá se operátor dereference (při práci s ukazateli). Funguje na ukazateli a udává hodnotu uloženou v tomto ukazateli.

Změna hodnoty ukazatele

Vezměme si příklad.

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

Přiřadili jsme adresu c ukazateli na PC.

Poté jsme změnili hodnotu c na 1. Protože pc a adresa c jsou stejné, *pcdává nám 1.

Vezměme si další příklad.

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

Přiřadili jsme adresu c ukazateli na PC.

Poté jsme změnili *pcna 1 pomocí *pc = 1;. Protože pc a adresa c jsou stejné, bude c rovno 1.

Vezměme si ještě jeden příklad.

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

Zpočátku je adresa c přiřazena k ukazateli pc pomocí pc = &c;. Protože c je 5, *pcdává nám 5.

Poté je adresa d přiřazena k ukazateli pc pomocí pc = &d;. Protože d je -15, *pcdává nám -15.

Příklad: Práce s ukazateli

Vezměme si funkční příklad.

 #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; ) 

Výstup

 Adresa c: 2686784 Hodnota c: 22 Adresa ukazatele pc: 2686784 Obsah ukazatele pc: 22 Adresa ukazatele pc: 2686784 Obsah ukazatele pc: 11 Adresa c: 2686784 Hodnota c: 2 

Vysvětlení 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;

V obou případech vytváříme ukazatel p(ne *p) a přiřazujeme &cjej.

Abychom se vyhnuli této nejasnosti, můžeme použít příkaz takto:

 int* p = &c;

Nyní víte, co jsou ukazatele, v dalším kurzu se naučíte, jak ukazatele souvisejí s poli.

Zajímavé články...