[ بستن ]

سیستم وبلاگ پارسی باکسسیستم مدیریت فروش هاست و دامینسایت شخصی محسن داوری برنامه نویس PHPهماهنگی با موتورهای جستجو , رنکینگ گوگل , google pagerank , page rank , seo , search

  انجمن اینترنتی برنامه نویسان  
  برنامه نویسی و رفع اشکال و نرم افزارها  
 
منوی اصلی

بخش ها

نویسندگان

آرشیو

آمار
بازدید امروز : 66
بازدید دیروز : 106 ‍
بازدید این ماه : 172
بازدید امسال : 17844
بازدید کل : 28908
تعداد پست ها : 89
تعداد لینک های لینکستان : 26
تعداد نظر سنجی های وبلاگ : 2

 
سخن روز


اشاره گر ها/ قسمت 5

بعثت خاندان رسالت ؛ خاتم پیامبران محمد مصطفی (ص) را به آقا امام زمان و شما دوستان خوب برنامه نویس و اعضاء انجمن تبریک می گویم. 



 


 

  • پیدا کردن آدرس داده

      هر متغیری دارای آدرس منحصر به فردی است که محل آن متغیر را در حافظه مشخص می‌کند . در بعضی کاربردها بهتر است که برای دستیابی به یک متغیر به جای نام آن متغیر ، از طریق آدرس آن دستیابی شود . برای بدست آوردن آدرس یک متغیر ، اپراتور ampersand   یا  & بکار برده می‌شود . برای مثال فرض کنید که متغیر k از نوع long  int  و آدرس آن 1234 باشد ، دستور :

Ptr = &k ;

 مقدار 1234 (آدرس متغیر  k) را در متغیر Ptr ذخیر می‌کند که البته باید Ptr از نوع اشاره‌گری که به متغیری از نوع long  int اشاره‌ می‌کند ، توصیف شده باشد .

 

مثال -  قطعه برنامه زیر مقدار و آدرس متغیر  kرا چاپ می‌کند .

# include <stdio.h>

main ( )

  {

     int  K = 5 ;

     printf ("the value of K is : %d\n" , k) ;

     printf ("the address of K is : %p\n" , &k) ;

   }

 

خروجی برنامه

the value of k is : 5

the address of k is : 1234

 

      یادآوری می‌شود که در تابع printf  برای چاپ آدرس متغیر از کد فرمت %p استفاده شده است . این کد فرمت ممکن است روی کامپایلرهای قدیمی وجود نداشته باشد .

      همچنین می‌توان قطعه برنامه بالا را بصورت زیر نیز نوشت :

# include <stdio.h>

main ( )

  {

    int  k = 5 ;

    int  *pk ;

    pk = &k ;       /* assigns the address of  k  to pk */

    printf ("the address of  k is : %p\n" , pk) ;

  }

خروجی این برنامه نیز مشابه قبلی خواهد بود .

      از مطالب بحث شده در این فصل نتیجه می‌گیریم که اپراتور ستاره یعنی * به دو مفهوم جداگانه بکار برده می‌شود :

الف) در معرفی متغیرها به‌عنوان اپراتور اشاره‌گر ، در سمت چپ متغیرهای مورد نظر قرار می‌گیرد ، مانند مثالهای زیر :

int  *p1 , *p2 , *p3 ;

float  *p4 , *p5 ;

char  *p6 , *p7 ;

ب) برای دستیابی به مقدار متغیری که آدرس آن در یک متغیر اشاره‌گر قرار دارد . برنامه زیر این مفاهیم را روشنتر می‌‌کند .

# include <stdio.h>

main ( )

   {

      char  * pch ;

      char  ch1 = `Z´ , ch2 ;

      printf ("the address of  pch is %p" , &pch) ;

      pch = &ch1 ;

      printf ("the value stored at  pch  is %p\n" , pch) ;

      printf ("the value stored at the address  pointed by pch is %c\n" , *pch) ;

      ch2 = *pch ;

      printf ("the value stored at  ch2  is %c\n" , ch2) ;

    }

 

خروجی برنامه

the address of  pch is 1004

the value stored at  pch is 2001

the value stored at the address pointed by  pch is  Z

the value stored at  ch2 is  Z

 

      در برنامه مزبور متغیر pch بعنوان اشاره‌گری به متغیرهایی از نوع کاراکتر اشاره می‌کند ، توصیف شده است . متغیرهای ch1 و ch2 نیز از نوع کاراکتر اعلان شده‌اند که به متغیر ch1 ، کاراکتر `a´ به‌عنوان مقدار اولیه نسبت داده شده است . در دستور printf  اول آدرس متغیر pch چاپ می‌گردد که به فرض 1004 می‌باشد . سپس آدرس متغیر ch1 ، به pch نسبت داده می‌شود و در دستور printf  دوم ، مقدار pch (آدرس متغیر ch1) که به فرض 2001 می‌باشد ، چاپ می‌گردد . در دستور printf  سوم ، محتوای خانه‌ای از حافظه که آدرس آن در متغیر pch قرار دارد (یعنی مقدار متغیر ch1) که کاراکتر `a´ است ، چاپ می‌شود . سپس در خط بعدی همین مقدار (یعنی حرف `a´) به متغیر ch2 نسبت داده می‌شود . بالاخره با دستور printf  آخری مقدار متغیر ch2 (که همان حرف `a´ می‌باشد) چاپ می‌گردد .

 

نکته - عبارت *pch می‌تواند در سمت چپ یک دستور جایگذاری ظاهر شود . مثلاً در همان برنامه بالا پس از اجرای دستور :

 pch = & ch1 ;

 با دستور :

 *pch = `b´ ; 

  کاراکتر b به متغیر ch1 نسبت داده می‌شود .

 

  • اشاره‌گر تهی (NULL pointer)

     زبان C مفهوم اشاره‌گر NULL را پشتیبانی می‌کند و آن اشاره‌گری است که به هیچ‌ شئی قابل قبول (معتبر) اشاره نمی‌کند . یک اشاره گر NULL ، هر اشاره‌گری است که مقدار صحیح صفر به آن نسبت داده باشد ؛ مانند مثال زیر.

 

مثال - در مثال زیر اشاره گر p   مقدار صفر دارد :

char   *p ;

p = 0 ;  

 

      اشاره‌گرهای NULL به ‌ویژه در دستورهای مربوط به کنترل جریان مفید هستند . زیرا اشاره‌گرهایی با مقدار صفر بعنوان false درنظر گرفته می‌شوند ، درحالی که متغیرهای اشاره‌گر با سایر مقادیر ، true منظور می‌گردند .

 

مثال - در برنامه زیر حلقه while تا موقعی که p یک اشاره‌گر NULL نباشد ، عمل تکرار را ادامه می‌دهد .

char  *p ;

    ....

    ....

while (p)

      {

         ....

         ....

      }

      این گونه کاربرد اشاره‌گرها به‌ ویژه در کاربردهایی که آرایه‌هایی از اشاره‌گرها را بکار می‌برد ، آشکار می‌گردد که دوباره در همین فصل بررسی خواهد شد .

  • عملیات روی اشاره‌گرها

      عملیات متداولی که روی اشاره‌‌گرها انجام می‌شوند ، عبارتند از :

الف) عمل انتساب

      در مورد اشاره‌گرها نیز مشابه سایر انواع متغیرها ، می‌توان مقداری را به یک متغیر اشاره‌گر نسبت داد . به هر حال بطوری که مشاهده شده ، این عمل مانند سایر متغیرها گسترده نمی‌باشد . به یک متغیر اشاره‌گر می‌توان آدرس یک متغیر یا مقدار صفر را نسبت داد .

 

ب) اعمال محاسباتی

      زبان C ، اجازه می‌دهد که یک مقدار صحیح را به یک اشاره‌گر اضافه کنید و یا از آن کسر نمایید ؛ برای مثال اگر p یک متغیر اشاره‌گر باشد ، عباراتی مشابه :

p+5  ,  p-5

معتبر است . ولی باید به مفهوم آن دقت کافی شود . برای مثال مفهوم p+5 آن است که به پنج شئی بعد از شئی که p به آن اشاره می‌کند ، اشاره خواهد کرد ؛ بنابراین اگر p آدرس متغیری از نوع :

 short  int  p ;

را داشته باشد که دو بایت حافظه اشغال می‌کند ، عبارت p+5 به :

 (10 = 2×5)  10 بایت    

بعد از آدرسی که p معرف آن است ، اشاره خواهد کرد . حال اگر p ، آدرس متغیری از نوع :

float  p ;

 را در خود داشته باشد ، عبارت p+5  به :

20 بایت  (20 = 4×5)

 بعد اشاره خواهد نمود . بنابراین p+5 همیشه به مفهوم به اندازه 5 شئی بعد از آنکه p  اشاره می‌کند ، خواهد بود . پس کامپایلر ، 5 را در بزرگی یا طول شئی مورد نظر برحسب بایت ضرب می‌کند و آن را بر محتوای p اضافه می‌کند ، تا آدرس جدید بدست آید . بنابراین عملیات محاسباتی روی اشاره‌گرها ، چهار عمل افزودن ، کاستن ، ++ و --  می‌باشد .

اگر دو متغیر اشاره‌گر از یک نوع باشند ، یعنی اشیایی که اشاره‌گرهای مزبور به آن اشاره می‌کنند ، یکسان باشند ، می‌توان مقادیر آن دو اشاره‌گر را از هم تفریق کرد ؛ برای مثال مقدار :

&a[3] - &a[0]

برابر 3 خواهد بود . درواقع این تفاضل تعداد اشیاء بین این دو اشاره‌گر را معرفی می‌نماید .

ادامه دارد.....


نوشته شده توسط محمد حسن بهجت | نظرات [4] | لینک به این مطلب |


 
تابلوی گفتمان



نظرسنجی

پیوندها

لوگو هـــا

خبرنامه ها





خبرنامه ویژه





خبرنامه عمومی


لوگو دوستان

پیوندهای روزانه

 
Copy Right 2007 ParsiBox.com ( Designed By ParsiBox Master Design )