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

هر متغیری دارای آدرس منحصر به فردی است که محل آن متغیر را در حافظه مشخص میکند . در بعضی کاربردها بهتر است که برای دستیابی به یک متغیر به جای نام آن متغیر ، از طریق آدرس آن دستیابی شود . برای بدست آوردن آدرس یک متغیر ، اپراتور 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 خواهد بود . درواقع این تفاضل تعداد اشیاء بین این دو اشارهگر را معرفی مینماید . ادامه دارد.....
|