C rādītāji (ar piemēriem)

Š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, &varatmiņā 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 inttipu.

Šā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 ctiek 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, *pcmums 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 *pcuz 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, *pcdod mums 5.

Pēc tam d adrese tiek piešķirta datora rādītājam, izmantojot pc = &d;. Tā kā d ir -15, *pcdod 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

  1. int* pc, c;

    Šeit tiek izveidots rādītāja pc un parastais mainīgais c, abi int.
    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.
  2. c = 22;

    Tas piešķir mainīgajam c 22. Tas ir, 22 tiek saglabāts mainīgā c atmiņas vietā.
  3. pc = &c;

    Tas piešķir mainīgā c adresi rādītāja pc.
  4. c = 11;

    Tādējādi mainīgajam c piešķir 11.
  5. *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 &ctam.

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.

Interesanti raksti...