
اشارهگرها متغیرهایی هستند که آدرس حافظه را نگهداری میکنند. اشارهگرها نهتنها میتوانند آدرس یک متغیر منفرد را نگهداری کنند، بلکه قادر هستند آدرس سلولهای آرایه را نیز ذخیره کنند. به مثال زیر توجه کنید:
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
datatype arrayname [rowsCount] [columnsCount]
مثال 4
#include <iostream> using namespace std; int main() { int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { cout << matrix[i][j] << " "; } cout << endl; } return 0; }
مقداردهی به آرایههای چندبعدی:
مقداردهی مستقیم
int matrix[2][3] = { {1, 2, 3}, // سطر اول {4, 5, 6} // سطر دوم };
مقداردهی سطری
int matrix[2][3] = {1, 2, 3, 4, 5, 6};
مقداردهی جزئی
int matrix[3][3] = { {1}, // سطر اول: 1, 0, 0 {2, 3}, // سطر دوم: 2, 3, 0 {4, 5, 6} // سطر سوم کامل };
دسترسی به عناصر آرایه چندبعدی
برای دسترسی به هر عنصر باید هر دو اندیس را مشخص کنید:
int value = matrix[1][2]; // دسترسی به عنصر سطر 2، ستون 3 matrix[0][1] = 10; // تغییر مقدار سطر 1، ستون 2
پیمایش آرایههای چندبعدی با حلقه
#include <iostream> using namespace std; int main() { int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { cout << matrix[i][j] << " "; } cout << endl; // رفتن به خط بعد بعد از هر سطر } return 0; }
خروجی:
1 2 3 4 5 6
آرایههای با ابعاد بیشتر
int cube[3][3][3]; // مکعب روبیک 3x3x3
مثال 5
#include <iostream> using namespace std; int main() { int space[2][3][4] = { { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }, { {13,14,15,16}, {17,18,19,20}, {21,22,23,24} } }; // نمایش تمام عناصر for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 4; k++) { cout << space[i][j][k] << " "; } cout << endl; } cout << endl; } return 0; }
Telegram: @CaKeegan
Gmail : amidgm2020@gmail.com