Դաս 15.1 Objective-C: Pointer arithmetic

0

Ինչպես արդեն գիտեք, Objective-C pointer-ը հասցե է, որն ունի թվային արժեք, այսինքն Դուք կարող եք դրա հետ կատարել մաթեմատիկական գործողություններ այն նշանների միջոցով՝ : ++, –, +, և –

Ավելի լավ հասկանալու համար եկեք ենթադրենք, ptr-ը integer pointer է, որն ուղղված է դեպի 1000 հասցեն: Եկեք կատարենք հետևյալ մաթեմատիկական գործողությունը pointer-ի հետ՝

ptr++

Այժմ ptr-ը ցույց կտա դեպի 1004 քանի որ ամեն անգամ, երբ ptr-ը աճում է, այն ցույց է տալիս հաջորդ integer location-ը.  Այս  գործողությունը կտեղափոխի pointer-ը հաջորդ memory location առանց իրական արժեքի վրա ազդելու: Եթե ptr-ը ցույց է տալիս նշան, որի հասցեն  1000 է, ապա վերոնշյալ գործողությունը ցույց կտա 1001 location քանի որ հաջորդ  character-ը հասանել կլինի 1001-ում:

Incrementing a Pointer

Pointer փոփոխականը ի տարբերություն array- ի, կարող է մեծանալ, քանի որ վերջինս կոնստանտ է:

#import <Foundation/Foundation.h>

const int MAX = 3;

int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* let us have array address in pointer */
   ptr = var;
   for ( i = 0; i < MAX; i++)
   {

      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

      /* move to the next location */
      ptr++;
   }
   return 0;
}

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

2013-09-14 00:08:36.215 demo[32000] Address of var[0] = 7e6f2a70
2013-09-14 00:08:36.216 demo[32000] Value of var[0] = 10
2013-09-14 00:08:36.216 demo[32000] Address of var[1] = 7e6f2a74
2013-09-14 00:08:36.216 demo[32000] Value of var[1] = 100
2013-09-14 00:08:36.216 demo[32000] Address of var[2] = 7e6f2a78
2013-09-14 00:08:36.216 demo[32000] Value of var[2] = 200

Decrementing a Pointer

Վերոնշյալ պնդումը վերաբերում է նաև pointer-ի նվազմանը

#import <Foundation/Foundation.h>

const int MAX = 3;

int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* let us have array address in pointer */
   ptr = &var[MAX-1];
   for ( i = MAX; i > 0; i--)
   {

      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

      /* move to the previous location */
      ptr--;
   }
   return 0;
}

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

2013-09-14 00:12:22.783 demo[13055] Address of var[3] = ea4c618
2013-09-14 00:12:22.783 demo[13055] Value of var[3] = 200
2013-09-14 00:12:22.783 demo[13055] Address of var[2] = ea4c614
2013-09-14 00:12:22.783 demo[13055] Value of var[2] = 100
2013-09-14 00:12:22.783 demo[13055] Address of var[1] = ea4c610
2013-09-14 00:12:22.783 demo[13055] Value of var[1] = 10

Pointer-ների համեմատություն

Pointer-ները կարող են համեմատվել հետևյալ օպերատորների միջոցով՝ ==, <, և >: Եթե p1 և p2  ցույց են տալիս իրար հետ կապ ունեցող փոփոխականների վրա, ինչպես օրինակ նույն զանգվածի էլեմենտներին են, ապա դրանք կարող են համեմատվել:

Հետևյալ ծրագիրը փոփոխում է նախորդ օրինակը

#import <Foundation/Foundation.h>

const int MAX = 3;

int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* let us have address of the first element in pointer */
   ptr = var;
   i = 0;
   while ( ptr <= &var[MAX - 1] )
   {

      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

      /* point to the previous location */
      ptr++;
      i++;
   }
   return 0;
}

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

2013-09-14 00:15:49.976 demo[24825] Address of var[0] = ae1235a0
2013-09-14 00:15:49.976 demo[24825] Value of var[0] = 10
2013-09-14 00:15:49.977 demo[24825] Address of var[1] = ae1235a4
2013-09-14 00:15:49.977 demo[24825] Value of var[1] = 100
2013-09-14 00:15:49.977 demo[24825] Address of var[2] = ae1235a8
2013-09-14 00:15:49.977 demo[24825] Value of var[2] = 200

 

Share.