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

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

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

فهرست مطالب این نوشته

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

1int* ptr;
2int a[5];
3ptr = &a[2];  // &a[2] is the address of third element of a[5].

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

فرض کنید لازم است اشاره‌گر به عنصر چهارم یک آرایه اشاره کند، یعنی باید آدرس عنصر چهارم را در مثال فوق ذخیره کند.

از آنجا که در مثال فوق ptr به عنصر سوم اشاره می‌کند، ptr+1 به عنصر چهارم اشاره خواهد کرد.

ممکن است فکر کنید که ptr+1 آدرس بایت بعد از ptr را ارائه می‌کند، اما چنین نیست.

دلیل این امر آن است که ptr اشاره‌گری به یک int است و اندازه آن به نوع سیستم عامل بستگی دارد. چنان که در سیستم‌های 64 بیتی اندازه int برابر با 4 بایت و در سیستم‌های 32 بیتی برابر با 2 بایت است. بدین ترتیب آدرس بیت ptr و ptr+1 چهار بایت فرق می‌کند.

اگر اشاره‌گر ptr به char اشاره کند در این صورت آدرس بین ptr و ptr+1 یک بایت تفاوت خواهد داشت زیرا اندازه نوع داده کاراکتر برابر با 1 بایت است.

مثال 1

برنامه ++C زیر برای نمایش آدرس عناصر یک آرایه با استفاده همزمان از آرایه و اشاره‌گر استفاده می‌شود.

1#include <iostream>
2using namespace std;
3int main()
4{
5    float arr[5];
6    float *ptr;
7    
8    cout << "Displaying address using arrays: " << endl;
9    for (int i = 0; i < 5; ++i)
10    {
11        cout << "&arr[" << i << "] = " << &arr[i] << endl;
12    }
13    // ptr = &arr[0]
14    ptr = arr;
15    cout<<"\nDisplaying address using pointers: "<< endl;
16    for (int i = 0; i < 5; ++i)
17    {
18        cout << "ptr + " << i << " = "<< ptr + i << endl;
19    }
20    return 0;
21}

خروجی

1Displaying address using arrays: 
2&arr[0] = 0x7fff5fbff880
3&arr[1] = 0x7fff5fbff884
4&arr[2] = 0x7fff5fbff888
5&arr[3] = 0x7fff5fbff88c
6&arr[4] = 0x7fff5fbff890
7
8Displaying address using pointers: 
9ptr + 0 = 0x7fff5fbff880
10ptr + 1 = 0x7fff5fbff884
11ptr + 2 = 0x7fff5fbff888
12ptr + 3 = 0x7fff5fbff88c
13ptr + 4 = 0x7fff5fbff890

در برنامه فوق یک اشاره‌گر متفاوت ptr برای نمایش دادن آدرس عنصر آرایه arr استفاده می‌شود.

اما عناصر آرایه می‌توانند با استفاده از نمادگذاری اشاره‌گر با بهره‌گیری از نام آرایه یعنی arr نیز مورد دسترسی قرار گیرند. به مثال زیر توجه کنید:

1int arr[3];
2
3&arr[0] is equivalent to arr
4&arr[1] is equivalent to arr + 1
5&arr[2] is equivalen to arr + 2

مثال 2

برنامه ++C زیر برای نمایش آدرس عناصر آرایه با استفاده از نمادگذاری اشاره‌گر نوشته شده است:

1#include <iostream>
2using namespace std;
3int main() {
4    float arr[5];
5    
6    cout<<"Displaying address using pointers notation: "<< endl;
7    for (int i = 0; i < 5; ++i) {
8        cout << arr + i <<endl;
9    }
10    return 0;
11}

خروجی

1Displaying address using pointers notation: 
20x7fff5fbff8a0
30x7fff5fbff8a4
40x7fff5fbff8a8
50x7fff5fbff8ac
60x7fff5fbff8b0

می‌دانیم که اشاره‌گر ptr آدرس را نگهداری می‌کند و عبارت ptr* مقدار ذخیره‌شده در آن آدرس را به دست می‌دهد. به طور مشابه می‌توان مقدار ذخیره‌شده در اشاره‌گر ptr+ را با استفاده از (ptr + 1)* به دست آورد. به کد زیر توجه کنید:

1int ptr[5] = {3, 4, 5, 5, 3};
  • ptr[0]& برابر است با ptr و ptr* برابر است با ptr[0]
  • ptr[1]& برابر است با ptr + 1 و (ptr + 1)* برابر است با ptr[1]
  • ptr[2]& برابر است با ptr + 2 و (ptr + 2)* برابر است با ptr[2]
  • ptr[i]& برابر است با ptr + i و (ptr + i)* برابر است با ptr[i]

مثال 3

برنامه ++C زیر برای درج و نمایش داده‌های وارد شده با استفاده از نمادگذاری اشاره‌گر نوشته شده است:

1#include <iostream>
2using namespace std;
3int main() {
4    float arr[5];
5    
6   // Inserting data using pointer notation
7    cout << "Enter 5 numbers: ";
8    for (int i = 0; i < 5; ++i) {
9        cin >> *(arr + i) ;
10    }
11    // Displaying data using pointer notation
12    cout << "Displaying data: " << endl;
13    for (int i = 0; i < 5; ++i) {
14        cout << *(arr + i) << endl ;
15    }
16    return 0;
17}

خروجی

1Enter 5 numbers: 2.5
23.5
34.5
45
52
6Displaying data: 
72.5
83.5
94.5
105
112

بدین ترتیب به پایان این مقاله می‌رسیم. برای مطالعه بخش بعدی این سری مقالات روی لینک زیر کلیک کنید:

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

==

بر اساس رای ۵ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
programiz
نظر شما چیست؟

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