V tomto výučbe sa dozviete o ukazovateľoch; čo sú ukazovatele, ako ich používate a bežné chyby, s ktorými sa môžete stretnúť pri práci s nimi pomocou príkladov.
Ukazovatele sú výkonnými funkciami programovania v jazykoch C a C ++. Predtým, ako sa naučíme ukazovatele, sa poďme dozvedieť viac o adresách v programovaní C.
Adresa v C
Ak máte vo svojom programe premennú var, &var
zobrazí sa vám jej adresa v pamäti.
Počas používania tejto scanf()
funkcie sme použili adresu mnohokrát .
scanf("%d", &var);
Tu sa hodnota zadaná používateľom uloží do adresy premennej var. Zoberme si pracovný prí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ýkon
var: 5 adresa var: 2686778
Poznámka: Po spustení vyššie uvedeného kódu pravdepodobne dostanete inú adresu.
C Ukazovatele
Ukazovatele (ukazovateľové premenné) sú špeciálne premenné, ktoré sa používajú skôr na ukladanie adries ako hodnôt.
Syntax ukazovateľa
Takto môžeme deklarovať ukazovatele.
int* p;
Tu sme deklarovali ukazovateľ p int
typu.
Ukazovatele môžete vyhlásiť aj týmito spôsobmi.
int *p1; int * p2;
Zoberme si ďalší príklad deklarovania ukazovateľov.
int* p1, p2;
Tu sme deklarovali ukazovateľ p1 a normálnu premennú p2.
Priradenie adries ukazovateľom
Zoberme si príklad.
int* pc, c; c = 5; pc = &c;
Tu je 5 priradených k premennej c. A adrese c je priradený ukazovateľ pc.
Získajte hodnotu veci, na ktorú poukazujú ukazovatele
Na získanie hodnoty veci, na ktorú ukazujú ukazovatele, používame *
operátor. Napríklad:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Tu je adresa c
počítača priradená ukazovateľu pc. Na získanie hodnoty uloženej na tejto adrese sme použili * pc.
Poznámka: Vo vyššie uvedenom príklade je počítač ukazovateľ, nie *pc
. Nemôžete a nemali by ste robiť niečo ako *pc = &c
;
Mimochodom, *
nazýva sa operátor dereferencie (pri práci s ukazovateľmi). Funguje na ukazovateli a udáva hodnotu uloženú v tomto ukazovateli.
Zmena hodnoty vyznačenej ukazovateľmi
Zoberme si príklad.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Adresu c sme priradili ukazovateľu pc.
Potom sme zmenili hodnotu c na 1. Pretože pc a adresa c sú rovnaké, *pc
dáva nám 1.
Zoberme si ďalší príklad.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Adresu c sme priradili ukazovateľu pc.
Potom sme zmenili *pc
na 1 pomocou *pc = 1;
. Pretože pc a adresa c sú rovnaké, c sa bude rovnať 1.
Zoberme si ešte jeden príklad.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Spočiatku je adresa c priradená počítačovému ukazovateľu pomocou pc = &c;
. Pretože c je 5, *pc
dáva nám 5.
Potom je adresa d priradená počítačovému ukazovateľu pomocou pc = &d;
. Pretože d je -15, *pc
dáva nám -15.
Príklad: práca s ukazovateľmi
Zoberme si pracovný prí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ýkon
Adresa c: 2686784 Hodnota c: 22 Adresa ukazovateľa pc: 2686784 Obsah ukazovateľa pc: 22 Adresa ukazovateľa pc: 2686784 Obsah ukazovateľa pc: 11 Adresa c: 2686784 Hodnota c: 2
Vysvetlenie 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 obidvoch prípadoch vytvárame ukazovateľ p
(nie *p
) a priraďujeme &c
mu.
Aby sme sa vyhli tejto nejasnosti, môžeme použiť nasledovné vyhlásenie:
int* p = &c;
Teraz viete, čo sú ukazovatele, a v nasledujúcom návode sa dozviete, ako súvisia ukazovatele s poliami.