Դաս 15 Objective-C: Pointers

0

Pointer-ներ կիրառելը Objective-C-ում բավականին հեշտ է սովորել: Որոշ ֆունկցիաներ դրանց շնորհիվ առավել հեշտ է կատարելը, որոշներն էլ առանց դրանց անհնար է: Այդ պատճառով pointer-ներին անդրադռնալը շատ կարևոր է:

Ինչպես արդեն գիտենք՝ ամեն փոփոխական հիշողության location է  և դրանցից յուրաքանչյուրն ունի իր հասցեն, որը կարող է օգտագործվել ampersand (&) operator-ի միջոցով: Տեսե՛ք հետևյալ օրինակը, որը կարտատպի սահմանված փոփոխականի հասցեն՝

#import <Foundation/Foundation.h>

int main ()
{
   int  var1;
   char var2[10];

   NSLog(@"Address of var1 variable: %x\n", &var1  );
   NSLog(@"Address of var2 variable: %x\n", &var2  );

   return 0;
}

Երբ վերոնշյալ կոդը կոմպիլացվում և իրականցվում է, մենք ստանում ենք հետևյալ արդյունքը՝

2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

Այսպիսով, Դուք հասկացաք՝ ինչ է նշանակում հիշողության հասցե և ինչպես է պետք օգտագործել այն: Դա հիմնական մասն էր, իսկ այժմ անցնենք  pointer-ին:

Ի՞նչ է Pointer-ը

Pointer-ը փոփոխականը է, որի արժեքը մեկ այլ փոփոխական է, այսինքն հիշողության location-ի ուղիղ հասցե: Ինչպես որ փոփոխականներն ու կոնստանտները, pointer-ը ևս պետք է հայտարարվի մինչ այն կարող եք կիրառել որևէ փոփոխականի հասցե տեղադրելու համար: pointer փոփոխականի հայտարարման ընդհանուր ձևն այսպիսին է՝

type *var-name;

Այստեղ type-ը pointer-ի base type-ն է: Այն պետք է լինի valid Objective-C data type, իսկ  var-name –ը pointer փոփոխականի անվանումն է:  աստղանիշը * որը անհրաժեշտ է  pointer-ը հայտարարելու համար նույնն է, ինչ որ բազմապատկման համար է: Սակայն այս դեպքում այն օգտագործվում է փոփոխականը որպես  pointer սահմանելու համար:  Ահա pointer-ի valid հայտարարման օրինակ՝

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

Բոլոր pointer-ների արժեքների data type-երը անկախ integer, float, character, կամ այլ տեսակի լինելուց, նույնն են երկար hexadecimal թիվ, որ ներկայացնում է հիշողության The Տարբեր data type-երի pointer-ների միակ տարբերությունը այն փոփոխականի կամ կոնստանտի data type-ն է, որին ուղղված է pointer-ը:

Ինչպե՞ս օգտագործել Pointer-ները

Կան մի քանի կարևոր գործողություններ, որոնք հաճախ կատարվում են pointer-ների օգնությամբ՝ (a) սահմանում ենք  pointer փոփոխականը (b) տալիս ենք փոփոխականի հասցեն pointer-ին, (c) հասնում ենք արժեքին, որը հասանելի է pointer փոփոխականի հասցեում: Դա արվում է unary operator *-ի միջոցով, որը վերադարձնում է այն փոփոխականի արժեքը, որը տեղադրված է իր Operand-ի կողմից նշված հասցեում:

Ահա օրինակ, որ կատարում է վերոնշյալ երեք գործողությունները՝

#import <Foundation/Foundation.h>

int main ()
{
   int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/

   NSLog(@"Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   NSLog(@"Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

Երբ վերոնշյալ կոդը կոմպիլացվում և իրականցվում է, մենք ստանում ենք հետևյալ արդյունքը՝

2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

NULL Pointers in Objective-C

It is always a good practice to assign a NULL value to a pointer variable in case you do not have exact address to be assigned. This is done at the time of variable declaration. A pointer that is assigned NULL is called a null pointer.

The NULL pointer is a constant with a value of zero defined in several standard libraries. Consider the following program:

#import <Foundation/Foundation.h>

int main ()
{
   int  *ptr = NULL;

   NSLog(@"The value of ptr is : %x\n", ptr  );
 
   return 0;
}

Երբ վերոնշյալ կոդը կոմպիլացվում և իրականցվում է, մենք ստանում ենք հետևյալ արդյունքը՝

2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

Օպերացիոն համակարգերի մեծամասնության դեպքում ծրագրերը իրավունք չունեն մուտք ունենալ 0 հասցեով հիշողությանը: Այսպիսով, եթե Pointer-ը պարունակում է null՝ 0 արժեք, ապա ենթադրվում է, որ այն ուղղված չէ դեպի որևէ բան:

null pointer-ի համար պետք է կիրառել if statement՝

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

Objective-C Pointer-ները մանրամասն

Pointer-ները ունեն բազմաթիվ սակայն պարզ կոնցեպտներ, որոնք շատ կարևորն են Objective-C-ում: Ահա դրանցից մի քանիսը՝

Կոնցեպտ Նկարագիր՝
Objective-C – Pointer arithmetic  Pointer-ների դեպքում կարող են կիրառվել 4 մաթեմատիկական օպերատորներ՝ ++, –, +, –
Objective-C – Array of pointers  Դուք կարող եք սահմանել զանգվածներ, մի քանի pointer-ներ պահպանելու համար
Objective-C – Pointer to pointer  Objective-C-ն թույլ է տալիս ունենալ pointer դեպի  pointer
Passing pointers to functions in Objective-C  Արգումենտի փոխանցում հասցեով կամ հղումով, որը հնարավորություն է տալիս փոխել արգումենտ կանչվող ֆունկցիայում կանչվող ֆունկցիայի միջոցով:
Return pointer from functions in Objective-C 

Objective-C-ն թույլ է տալիս ֆունկցիային վերադարձնել  pointer-ը local փոփոխականին, static փոփոխականին և dynamically allocated memory-ին.

 

Share.