Kas ir rādītājs C?
Pointer C, ir mainīgs lielums, veikali risināt citas mainīgo. Rādītāju var izmantot arī, lai atsauktos uz citu rādītāja funkciju. Rādītāju var palielināt / samazināt, ti, norādīt uz nākamo / iepriekšējo atmiņas vietu. Rādītāja mērķis ir ietaupīt atmiņas vietu un panākt ātrāku izpildes laiku.
Kā lietot rādītājus C.
Ja mēs deklarēsim int tipa mainīgo v, v faktiski saglabās vērtību.
v tagad ir vienāds ar nulli.
Tomēr katram mainīgajam, izņemot vērtību, ir arī sava adrese (vai, vienkārši sakot, kur tā atrodas atmiņā). Adresi var iegūt, pirms mainīgā nosaukuma ievietojot ampersandu (&).
Ja ekrānā drukājat mainīgā adresi, tas izskatīsies kā pilnīgi nejaušs skaitlis (turklāt tas var atšķirties no palaist uz palaist).
Izmēģināsim to praksē ar rādītāju C piemērā
Šīs programmas izeja ir -480613588.
Kas tagad ir rādītājs? Tā vietā, lai saglabātu vērtību, rādītājs y saglabās mainīgā adresi.
Rādītāja mainīgais
Int * y = & v;
Mainīgs |
RĀDĪTĀJS |
Vērtība glabāti nosaukts glabāšanas / atmiņas adresi |
Mainīgās ka norāda uz glabāšanas / atmiņas adresi uz citu mainīgo |
Rādītāja deklarēšana
Tāpat kā mainīgie, arī C programmēšanas rādītāji ir jādeklarē, pirms tos var izmantot jūsu programmā. Rādītājus var nosaukt par visu, ko vēlaties, ja vien tie ievēro C vārda noteikšanas noteikumus. Rādītāja deklarācijai ir šāda forma.
data_type * pointer_variable_name;
Šeit,
- data_type ir rādītāja C mainīgo tipu bāzes tips un norāda mainīgā tipu, uz kuru rādītājs norāda.
- Zvaigznīte (*: tā pati zvaigznīte, ko izmanto reizināšanai), kas ir virziena operētājs, deklarē rādītāju.
Apskatīsim dažas derīgas rādītāju deklarācijas šajā C rādītāju apmācībā:
int *ptr_thing; /* pointer to an integer */int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */double *ptr2; /* pointer to a double */float *ptr3; /* pointer to a float */char *ch1 ; /* pointer to a character */float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */
Inicializējiet rādītāju
Pēc rādītāja deklarēšanas mēs to inicializējam kā standarta mainīgos ar mainīgu adresi. Ja rādītāji C programmēšanā netiek inicializēti un tiek izmantoti programmā, rezultāti ir neparedzami un, iespējams, katastrofāli.
Lai iegūtu mainīgā adresi, mēs izmantojam operatoru ampersand (&), kas atrodas pirms mainīgā nosaukuma, kura adrese mums ir nepieciešama. Rādītāja inicializēšana tiek veikta ar šādu sintaksi.
Rādītāja sintakse
pointer = &variable;
Zemāk ir dota vienkārša programma rādītāja ilustrācijai:
#includeint main(){int a=10; //variable declarationint *p; //pointer variable declarationp=&a; //store address of variable a in pointer pprintf("Address stored in a variable p is:%x\n",p); //accessing the addressprintf("Value stored in a variable p is:%d\n",*p); //accessing the valuereturn 0;}
Izeja:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operators | Nozīme |
* | Kalpo 2 mērķiem
|
& | Kalpo tikai vienam mērķim
|
Norāžu veidi C
Tālāk ir norādīti dažādi C rādītāju veidi :
Null rādītājs
Mēs varam izveidot nulles rādītāju, piešķirot nulles vērtību rādītāja deklarēšanas laikā. Šī metode ir noderīga, ja rādītājam nav piešķirta neviena adrese. Nulles rādītājā vienmēr ir vērtība 0.
Šī programma ilustrē nulles rādītāja izmantošanu:
#includeint main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}
Izeja:
The value inside variable p is:0
Void Rādītājs
Programmējot C, tukšo rādītāju sauc arī par vispārēju rādītāju. Tam nav standarta datu veida. Tukšs rādītājs tiek izveidots, izmantojot atslēgvārdu void. To var izmantot jebkura mainīgā adreses glabāšanai.
Šī programma ilustrē tukša rādītāja izmantošanu:
#includeint main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Izeja:
The size of pointer is:4
Savvaļas rādītājs
Rādītājs tiek uzskatīts par savvaļas rādītāju, ja tas netiek inicializēts. Šāda veida C rādītāji nav efektīvi, jo tie var norādīt uz nezināmu atmiņas vietu, kas var radīt problēmas mūsu programmā, un tas var izraisīt programmas avāriju. Vienmēr jābūt uzmanīgam, strādājot ar savvaļas rādītājiem.
Šī programma ilustrē savvaļas rādītāja izmantošanu:
#includeint main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Rezultāts
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Citi “c” rādītāju veidi ir šādi:
- Dangling rādītājs
- Komplekss rādītājs
- Blakus rādītājs
- Tāls rādītājs
- Milzīgs rādītājs
Tiešās un netiešās piekļuves norādes
C valodā ir divi līdzvērtīgi veidi, kā piekļūt mainīgajam saturam un ar to manipulēt
- Tieša piekļuve: mēs tieši izmantojam mainīgā nosaukumu
- Netieša piekļuve: mēs izmantojam rādītāju mainīgajam
Sapratīsim to ar zemāk esošās programmas palīdzību
#include/* Declare and initialize an int variable */int var = 1;/* Declare a pointer to int */int *ptr;int main( void ){/* Initialize ptr to point to var */ptr = &var;/* Access var directly and indirectly */printf("\nDirect access, var = %d", var);printf("\nIndirect access, var = %d", *ptr);/* Display the address of var two ways */printf("\n\nThe address of var = %d", &var);printf("\nThe address of var = %d\n", ptr);/*change the content of var through the pointer*/*ptr=48;printf("\nIndirect access, var = %d", *ptr);return 0;}
Pēc programmas sastādīšanas bez kļūdām rezultāts ir šāds:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Rādītāju aritmētika C
Rādītāja darbības ir apkopotas nākamajā attēlā

Prioritārā darbība (prioritāte)
Strādājot ar C rādītājiem, mums jāievēro šādi prioritārie noteikumi:
- Operatoriem * un & ir tāda pati prioritāte kā unāriem operatoriem (noliegums!, Pieaugums ++, samazinājums--).
- Tajā pašā izteiksmē vienādie operatori *, &,!, ++, - tiek vērtēti no labās uz kreiso.
Ja P rādītājs norāda uz X mainīgo, tad * P var izmantot visur, kur var rakstīt X.
Šīs izteiksmes ir līdzvērtīgas:
int X = 10 int * P = & Y; Attiecībā uz iepriekš minēto kodu zemāk izteicieni ir patiesi | |
Izteiksme | Ekvivalenta izteiksme |
Y = * P + 1 * P = * P + 10 * P + = 2 ++ * P (* P) ++ | Y = X + 1 X = X + 10 X + = 2 ++ X X ++ |
Pēdējā gadījumā ir nepieciešamas iekavas: tā kā vienotie operatori * un ++ tiek vērtēti no labās uz kreiso pusi, bez iekavām palielinās rādītājs P, nevis objekts, uz kura norāda P.
Zemāk esošajā tabulā parādīta aritmētiskā un pamata darbība, ko var izmantot, strādājot ar C rādītājiem
Darbība | Paskaidrojums |
Uzdevums | int * P1, * P2 P1 = P2; P1 un P2 norāda uz to pašu vesela skaitļa mainīgo |
Pieaugums un samazināšana | Int * P1; P1 ++; P1--; |
Ofseta pievienošana (nemainīga) | Tas ļauj rādītājam pārvietot N elementus tabulā. Rādītājs tiks palielināts vai samazināts par N, kas reizināts ar mainīgā veida baitu (-u) skaitu. P1 + 5; |
C rādītāji un masīvi ar piemēriem
Tradicionāli mēs piekļūstam masīva elementiem, izmantojot tā indeksu, taču šo metodi var novērst, izmantojot rādītājus. Norādes atvieglo piekļuvi katram masīva elementam.
#includeint main(){int a[5]={1,2,3,4,5}; //array initializationint *p; //pointer declaration/*the ptr points to the first element of the array*/p=a; /*We can also type simply ptr==&a[0] */printf("Printing the array elements using pointer\n");for(int i=0;i<5;i++) //loop for traversing array elements{printf("\n%x",*p); //printing array elementsp++; //incrementing to the next element, you can also write p=p+1}return 0;}
Rezultāts
12345
Pievienojot rādītājam noteiktu skaitli, rādītāja atrašanās vieta tiks pārvietota uz vērtību, kas iegūta, pievienojot operāciju. Pieņemsim, ka p ir rādītājs, kas pašlaik norāda uz atmiņas vietu 0, ja veicam šādu pievienošanas darbību p + 1, tas tiks izpildīts šādā veidā:

Tā kā p pēc 1 pievienošanas pašlaik norāda uz vietu 0, vērtība kļūs par 1, un līdz ar to rādītājs norādīs uz atmiņas vietu 1.
C Norādes un virknes ar piemēriem
Virkne ir char objektu masīvs, kas beidzas ar nulles rakstzīmi '\ 0'. Mēs varam manipulēt ar virknēm, izmantojot rādītājus. Šis rādītājs C piemērā izskaidro šo sadaļu
#include#include int main(){char str[]="Hello Guru99!";char *p;p=str;printf("First character is:%c\n",*p);p =p+1;printf("Next character is:%c\n",*p);printf("Printing all the characters in a string\n");p=str; //reset the pointerfor(int i=0;i Rezultāts
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!Vēl viens veids, kā tikt galā ar virknēm, ir ar rādītāju masīvu, piemēram, šajā programmā:
#includeint main(){char *materials[ ] = { "iron", "copper", "gold"};printf("Please remember these materials :\n");int i ;for (i = 0; i < 3; i++) {printf("%s\n", materials[ i ]);}return 0;} Izeja:
Please remember these materials:ironcoppergoldNorāžu priekšrocības C.
- Norādes ir noderīgas, lai piekļūtu atmiņas vietām.
- Norādes nodrošina efektīvu veidu, kā piekļūt masīva struktūras elementiem.
- Norādes tiek izmantotas dinamiskai atmiņas piešķiršanai, kā arī darījumu izvietošanai.
- Norādes tiek izmantotas, lai izveidotu sarežģītas datu struktūras, piemēram, saistītu sarakstu, diagrammu, koku utt.
Norāžu trūkumi C
- Norādes ir nedaudz sarežģītas, lai tās saprastu.
- Norādes var izraisīt dažādas kļūdas, piemēram, segmentēšanas kļūdas, vai var piekļūt atmiņas vietai, kas vispār nav nepieciešama.
- Ja rādītājam tiek sniegta nepareiza vērtība, tas var izraisīt atmiņas bojājumus.
- Norādes ir atbildīgas arī par atmiņas noplūdi.
- Norādes ir salīdzinoši lēnākas nekā mainīgajiem.
- Programmētājiem ir ļoti grūti strādāt ar rādītājiem; tāpēc programmētāja pienākums ir uzmanīgi manipulēt ar rādītāju.
Kopsavilkums
- Rādītājs nav nekas cits kā atmiņas vieta, kur tiek glabāti dati.
- Lai piekļūtu atmiņas vietai, tiek izmantots rādītājs.
- Ir dažādu veidu rādītāji, piemēram, nulles rādītājs, aizstājējzīme, tukšs rādītājs un cita veida rādītāji.
- Lai efektīvāk piekļūtu elementiem, rādītājus var izmantot ar masīvu un virkni.
- Mēs varam izveidot funkciju norādes, lai dinamiski izsauktu funkciju.
- Aritmētiskās darbības var veikt ar rādītāju, kas ir pazīstams kā rādītāja aritmētika.
- Norādes var norādīt arī uz funkciju, kas ļauj viegli izsaukt dažādas funkcijas, ja tiek definēts rādītāju masīvs.
- Ja vēlaties nodarboties ar dažādu mainīgo datu tipu, varat izmantot nederīgu rādītāju.