اشاره گرهای ++C — راهنمای جامع

۳۶۲۷ بازدید
آخرین به‌روزرسانی: ۲۹ شهریور ۱۴۰۲
زمان مطالعه: ۴ دقیقه
اشاره گرهای ++C — راهنمای جامع

در این مقاله هر آن چه به اشاره گرهای ++C مربوط می‌شود را خواهیم آموخت. بدین ترتیب با روش ذخیره‌سازی مقادیر در رایانه و شیوه دسترسی به آن‌ها با استفاده از اشاره‌گرها آشنا می‌شویم. برای مطالعه بخش قبلی این سری مقالات روی لینک زیر کلیک کنید:

اشاره‌گر یکی از قابلیت‌های قدرتمند زبان ++C محسوب می‌شود که آن را از زبان‌های برنامه‌نویسی دیگر مانند جاوا یا پایتون متمایز می‌سازد. اشاره‌گرهای ++C برای دسترسی به حافظه و دستکاری آدرس مورد استفاده قرار می‌گیرند.

آدرس در ++C

برای درک اشاره‌گرها ابتدا باید با شیوه ذخیره‌سازی داده‌ها در رایانه آشنا شوید. هر متغیر که در برنامه ایجاد می‌شود به یک مکان از حافظه رایانه انتساب می‌یابد. مقداری که در متغیر ذخیره می‌شود در عمل به آن مکان حافظه انتساب پیدا می‌کند.

++C برای دانستن این که داده‌ها کجا ذخیره شده‌اند، یک عملگر به نام عملگر ارجاع (&) دارد. عملگر ارجاع یا (&) آدرس حافظه اشغال شده از سوی متغیر را در اختیار ما قرار می‌دهد. اگر var یک متغیر باشد، در این صورت ‎&var آدرس آن متغیر است.

مثال 1

1#include <iostream>
2using namespace std;
3int main()
4{
5    int var1 = 3;
6    int var2 = 24;
7    int var3 = 17;
8    cout << &var1 << endl;
9    cout << &var2 << endl;
10    cout << &var3 << endl;
11}

خروجی

0x7fff5fbff8ac
0x7fff5fbff8a8
0x7fff5fbff8a4

نکته: توجه کنید نتایجی که شما به دست می‌آورید به احتمال زیاد با خروجی فوق متفاوت خواهند بود.

عبارت 0x در ابتدای آدرس نشان‌دهنده این است که آدرس به شکل هگزادسیمال است. همچنین توجه کنید که آدرس اول 4 بایت با آدرس دوم فرق دارد و اختلاف آدرس دوم و سوم نیز همین مقدار 4 بایت است. دلیل این مسئله آن است که اندازه متغیر صحیح (نوع متغیر int) در سیستم‌های 64 بیتی، 4 بایت است.

متغیرهای اشاره‌گر

++C امکان دستکاری مستقیم داده‌ها را در حافظه فراهم کرده است. بدین ترتیب می‌توان هر فضایی از حافظه را بنا به ضرورت انتساب داد یا از انتساب خارج کرد. این کار با استفاده از متغیرهای اشاره‌گر صورت می‌گیرد.

شیوه اعلان متغیر چگونه است؟

1int *p;
2      OR,
3int* p;

گزاره فوق یک متغیر اشاره‌گر به نام p تعریف می‌کند. این متغیر یک آدرس حافظه را نگهداری می‌کند. علامت ستاره عملگر ارجاع‌زدایی است که به معنی «اشاره‌گری به» است. در کد فوق اشاره‌گر p به int اشاره می‌کند یعنی یک مقدار صحیح در آدرس حافظه.

عملگر ارجاع (&) و عملگر ارجاع‌زدایی (*)

چنان که پیش‌تر اشاره کردیم عملگر ارجاع آدرس یک متغیر را ارائه می‌کند. برای دریافت مقدار ذخیره شده در آدرس حافظه از عملگر ارجاع‌زدایی یعنی * استفاده می‌کنیم.

برای نمونه اگر متغیر number در آدرس حافظه 0x123 ذخیره شده باشد و مقدار 5 داشته باشد، عملگر ارجاع (&) مقدار 0x123 را به ما می‌دهد، در حالی که عملگر ارجاع‌زدایی (*) مقدار آن یعنی 5 را در اختیار ما قرار می‌دهد.

نکته: علامت (*) که در اعلان اشاره‌گر ++C استفاده می‌شود، یک عملگر ارجاع‌زدایی نیست و صرفاً یک نمادگذاری مشابه برای ایجاد یک اشاره‌گر محسوب می‌شود.

مثال 2

برنامه ++C زیر برای نمایش طرز کار اشاره‌گر نوشته شده است.

1#include <iostream>
2using namespace std;
3int main() {
4    int *pc, c;
5    
6    c = 5;
7    cout << "Address of c (&c): " << &c << endl;
8    cout << "Value of c (c): " << c << endl << endl;
9    pc = &c;    // Pointer pc holds the memory address of variable c
10    cout << "Address that pointer pc holds (pc): "<< pc << endl;
11    cout << "Content of the address pointer pc holds (*pc): " << *pc << endl << endl;
12    
13    c = 11;    // The content inside memory address &c is changed from 5 to 11.
14    cout << "Address pointer pc holds (pc): " << pc << endl;
15    cout << "Content of the address pointer pc holds (*pc): " << *pc << endl << endl;
16    *pc = 2; 
17    cout << "Address of c (&c): " << &c << endl;
18    cout << "Value of c (c): " << c << endl << endl;
19    return 0;
20}

خروجی

1Address of c (&c): 0x7fff5fbff80c
2Value of c (c): 5
3
4Address that pointer pc holds (pc): 0x7fff5fbff80c
5Content of the address pointer pc holds (*pc): 5
6
7Address pointer pc holds (pc): 0x7fff5fbff80c
8Content of the address pointer pc holds (*pc): 11
9
10Address of c (&c): 0x7fff5fbff80c
11Value of c (c): 2

اشاره گرهای ++C

توضیح برنامه

  • زمانی که ;c=5 است، مقدار 5 در آدرس متغیر c یعنی 0x7fff5fbff8c ذخیره می‌شود.
  • زمانی که ;pc=c& است، اشاره‌گر pc آدرس c را نگهداری می‌کند که 0x7fff5fbff8c است و عبارت (عملگر ارجاع‌زدایی) pc* مقدار ذخیره شده در آن آدرس یعنی 5 را در خروجی ارائه می‌کند.
  • زمانی که ;c=11 است، از آنجا که اشاره‌گر آدرس pc همان مقدار c را نگهداری می‌کند، شامل مقدار 0x7fff5fbff8c است. هر تغییری در مقدار c هنگام اجرای pc* نیز بازتاب می‌یابد و در خروجی مقدار 11 را می‌بینیم.
  • زمانی که ;pc=2* است، محتوای آدرس ذخیره شده از سوی pc یعنی 0x7fff5fbff8c تغییر پیدا می‌کند. این مقدار از 11 به 2 عوض می‌شود. از این رو وقتی به مقدار c اشاره می‌کنیم، مقدار آن نیز 2 شده است.

خطاهای رایج هنگام کار کردن با اشاره‌گرها

فرض کنید می‌خواهید اشاره‌گر pc به آدرس c اشاره کند. در این صورت:

1int c, *pc;
2pc=c;  /* Wrong! pc is address whereas, c is not an address. */
3*pc=&c; /* Wrong! *pc is the value pointed by address whereas, %amp;c is an address. */
4pc=&c; /* Correct! pc is an address and, %amp;pc is also an address. */
5*pc=c; /* Correct! *pc is the value pointed by address and, c is also a value. */

در هر دو مورد اشاره‌گر pc به آدرس c اشاره نمی‌کند.

برای مطالعه بخش بعدی این مجموعه مطالب آموزشی روی لینک زیر کلیک کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۳۸ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
programiz
۱ دیدگاه برای «اشاره گرهای ++C — راهنمای جامع»

سلام ممنون از نویسنده این مطلب و ممنون از سایت عالی تون،تو این مدت که دانشگاه مجازیه خیلی استفاده کردم از سایتتون

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *