در این مقاله در مورد رابطه بین آرایه ها و اشاره گرهای ++C و همچنین استفاده مؤثر از آنها در برنامهها صحبت خواهیم کرد. برای مطالعه بخش قبلی این سری مقالات راهنمای جامع ++C، روی لینک زیر کلیک کنید:
اشارهگرها متغیرهایی هستند که آدرس حافظه را نگهداری میکنند. اشارهگرها نهتنها میتوانند آدرس یک متغیر منفرد را نگهداری کنند، بلکه قادر هستند آدرس سلولهای آرایه را نیز ذخیره کنند. به مثال زیر توجه کنید:
int* ptr; int a[5]; ptr = &a[2]; // &a[2] is the address of third element of a[5].
فرض کنید لازم است اشارهگر به عنصر چهارم یک آرایه اشاره کند، یعنی باید آدرس عنصر چهارم را در مثال فوق ذخیره کند.
از آنجا که در مثال فوق 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
بدین ترتیب به پایان این مقاله میرسیم. برای مطالعه بخش بعدی این سری مقالات روی لینک زیر کلیک کنید:
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی C++
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- آموزش ++C — راهنمای شروع یادگیری
- Overload کردن عملگر در ++C — راهنمای جامع
==