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, &var
dá 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 int
typu.
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 c
počí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é, *pc
dá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 *pc
na 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, *pc
dává nám 5.
Poté je adresa d přiřazena k ukazateli pc pomocí pc = &d;
. Protože d je -15, *pc
dá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
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, 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.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*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 &c
jej.
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.