برنامه نویسی ۱۴۰۲ بازدید

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

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

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

int* ptr;
int a[5];
ptr = &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 زیر برای نمایش آدرس عناصر یک آرایه با استفاده همزمان از آرایه و اشاره‌گر استفاده می‌شود.

#include <iostream>
using namespace std;
int main()
{
    float arr[5];
    float *ptr;
    
    cout << "Displaying address using arrays: " << endl;
    for (int i = 0; i < 5; ++i)
    {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
    }
    // ptr = &arr[0]
    ptr = arr;
    cout<<"\nDisplaying address using pointers: "<< endl;
    for (int i = 0; i < 5; ++i)
    {
        cout << "ptr + " << i << " = "<< ptr + i << endl;
    }
    return 0;
}

خروجی

Displaying address using arrays: 
&arr[0] = 0x7fff5fbff880
&arr[1] = 0x7fff5fbff884
&arr[2] = 0x7fff5fbff888
&arr[3] = 0x7fff5fbff88c
&arr[4] = 0x7fff5fbff890

Displaying address using pointers: 
ptr + 0 = 0x7fff5fbff880
ptr + 1 = 0x7fff5fbff884
ptr + 2 = 0x7fff5fbff888
ptr + 3 = 0x7fff5fbff88c
ptr + 4 = 0x7fff5fbff890

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

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

int arr[3];

&arr[0] is equivalent to arr
&arr[1] is equivalent to arr + 1
&arr[2] is equivalen to arr + 2

مثال 2

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

#include <iostream>
using namespace std;
int main() {
    float arr[5];
    
    cout<<"Displaying address using pointers notation: "<< endl;
    for (int i = 0; i < 5; ++i) {
        cout << arr + i <<endl;
    }
    return 0;
}

خروجی

Displaying address using pointers notation: 
0x7fff5fbff8a0
0x7fff5fbff8a4
0x7fff5fbff8a8
0x7fff5fbff8ac
0x7fff5fbff8b0

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

int 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 زیر برای درج و نمایش داده‌های وارد شده با استفاده از نمادگذاری اشاره‌گر نوشته شده است:

#include <iostream>
using namespace std;
int main() {
    float arr[5];
    
   // Inserting data using pointer notation
    cout << "Enter 5 numbers: ";
    for (int i = 0; i < 5; ++i) {
        cin >> *(arr + i) ;
    }
    // Displaying data using pointer notation
    cout << "Displaying data: " << endl;
    for (int i = 0; i < 5; ++i) {
        cout << *(arr + i) << endl ;
    }
    return 0;
}

خروجی

Enter 5 numbers: 2.5
3.5
4.5
5
2
Displaying data: 
2.5
3.5
4.5
5
2

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

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

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» در رشته‌های ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار با مجله فرادرس همکاری دارد.