Šajā apmācībā jūs uzzināsiet par rādītājiem; kādi ir rādītāji, kā tos izmantojat, un parastās kļūdas, ar kurām var saskarties, strādājot ar tām, izmantojot piemērus.
Rādītāji ir spēcīgas C un C ++ programmēšanas funkcijas. Pirms apgūstam rādītājus, uzzināsim par adresēm C programmēšanā.
Adrese C
Ja jūsu programmā ir mainīgs lielums var, &var
atmiņā ierakstīsit tā adresi.
scanf()
Funkcijas izmantošanas laikā mēs vairākas reizes esam izmantojuši adresi .
scanf("%d", &var);
Šeit lietotāja ievadītā vērtība tiek saglabāta mainīgā mainīgā adresē. Ņemsim darba piemēru.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Rezultāts
var: 5 var: 2686778 adrese
Piezīme. Visticamāk, saņemot citu kodu, saņemsit citu adresi.
C Norādes
Rādītāji (rādītāju mainīgie) ir īpaši mainīgie, kurus izmanto adrešu, nevis vērtību glabāšanai.
Rādītāja sintakse
Lūk, kā mēs varam paziņot norādes.
int* p;
Šeit mēs esam deklarējuši rādītāja p int
tipu.
Šādos veidos varat arī paziņot rādītājus.
int *p1; int * p2;
Ņemsim vēl vienu rādītāju deklarēšanas piemēru.
int* p1, p2;
Šeit mēs esam deklarējuši rādītāju p1 un parasto mainīgo p2.
Adrešu piešķiršana rādītājiem
Ņemsim piemēru.
int* pc, c; c = 5; pc = &c;
Šeit 5 tiek piešķirts mainīgajam c. Un c adrese tiek piešķirta pc rādītājam.
Iegūstiet lietas vērtību, ko norāda norādes
Lai iegūtu norādes norādītās lietas vērtību, mēs izmantojam *
operatoru. Piemēram:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Šeit adrese c
tiek piešķirta pc rādītājam. Lai iegūtu šajā adresē saglabāto vērtību, mēs izmantojām * pc.
Piezīme. Iepriekš minētajā piemērā pc ir rādītājs, nevis *pc
. Jūs nevarat un nedrīkstat darīt kaut ko līdzīgu *pc = &c
;
Starp citu, *
tiek dereferences operators (strādājot ar rādītājiem). Tas darbojas ar rādītāju un dod šajā rādītājā saglabāto vērtību.
Norādīto vērtību mainīšana
Ņemsim piemēru.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Datora rādītājam esam piešķīruši c adresi.
Pēc tam mēs mainījām c vērtību uz 1. Tā kā pc un c adrese ir vienāda, *pc
mums dod 1.
Ņemsim vēl vienu piemēru.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Datora rādītājam esam piešķīruši c adresi.
Pēc tam mēs mainījāmies *pc
uz 1, izmantojot *pc = 1;
. Tā kā pc un c adrese ir vienāda, c būs vienāds ar 1.
Ņemsim vēl vienu piemēru.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Sākumā c adrese tiek piešķirta pc rādītājam, izmantojot pc = &c;
. Tā kā c ir 5, *pc
dod mums 5.
Pēc tam d adrese tiek piešķirta datora rādītājam, izmantojot pc = &d;
. Tā kā d ir -15, *pc
dod mums -15.
Piemērs: Norāžu darbība
Ņemsim darba piemēru.
#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; )
Rezultāts
C adrese: 2686784 c vērtība: 22 rādītāja pc adrese: 2686784 rādītāja pc adrese: 22 rādītāja pc adrese: 22 rādītāja pc adrese: 2686784 rādītāja pc saturs: 11 c rādītājs: 2686784 c vērtība: 2
Programmas skaidrojums
int* pc, c;
Šeit tiek izveidots rādītāja pc un parastais mainīgais c, abiint
.
Tā kā pc un c sākotnēji netiek inicializētas, rādītājs pc norāda vai nu uz adresi, vai uz nejaušu adresi. Mainīgajam c ir adrese, bet tajā ir nejauša atkritumu vērtība.c = 22;
Tas piešķir mainīgajam c 22. Tas ir, 22 tiek saglabāts mainīgā c atmiņas vietā.pc = &c;
Tas piešķir mainīgā c adresi rādītāja pc.c = 11;
Tādējādi mainīgajam c piešķir 11.*pc = 2;
Tas mainīs vērtību atmiņas vietā, uz kuru norāda rādītāja pc, uz 2.
Bieži pieļautās kļūdas, strādājot ar rādītājiem
Pieņemsim, ka vēlaties, lai rādītāja pc norādītu uz c adresi. Tad,
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;
Šeit ir piemērs, kā iesācēju sintakses iesācējiem bieži šķiet mulsinoši.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Kāpēc, lietojot, mēs nesaņēmām kļūdu int *p = &c;
?
Tas tāpēc, ka
int *p = &c;
ir ekvivalents
int *p: p = &c;
Abos gadījumos mēs izveidojam rādītāju p
(nevis *p
) un piešķiram &c
tam.
Lai izvairītos no šīs neskaidrības, mēs varam izmantot šādu paziņojumu:
int* p = &c;
Tagad jūs zināt, kas ir rādītāji, un nākamajā apmācībā uzzināsiet, kā rādītāji ir saistīti ar masīviem.