پوینتر و آرایه ها (Pointers & Arrays)
اینجا می بینیم چطور «پوینتر (Pointer)» با «آرایه (Array)» کار می کند. آرایه مثل ردیف صندلی هاست؛ پوینتر مثل بلیت با شماره صندلی است.
دسترسی معمولی به آرایه
اول آرایه را بسازیم و با حلقه for چاپ کنیم.
int myNumbers[4] = { 25, 50, 75, 100 };
int i;
for (i = 0; i < 4; i++) {
printf("%d\n", myNumbers[i]);
}
دیدن آدرس هر عضو
با «عملگر ارجاع (&)» آدرس هر عنصر را می گیریم.
int myNumbers[4] = { 25, 50, 75, 100 };
int i;
for (i = 0; i < 4; i++) {
printf("%p\n", &myNumbers[i]);
}
نکته: معمولاً int چهار بایت است؛ پس آدرس ها چهار تا چهار تا جلو می روند.
int myInt;
printf("%zu\n", sizeof(myInt));
int myNumbers[4] = { 25, 50, 75, 100 };
printf("%zu\n", sizeof(myNumbers));
رابطه پوینتر با آرایه
نام آرایه، «پوینتر به اولین عنصر» است. یعنی آدرس عنصر صفر.
int myNumbers[4] = { 25, 50, 75, 100 };
printf("%p\n", myNumbers);
printf("%p\n", &myNumbers[0]);
خواندن مقدار با Dereference
با «ستاره (*)» مقدار داخل آدرس را می خوانیم. این می شود Dereference.
int myNumbers[4] = { 25, 50, 75, 100 };
printf("%d\n", *myNumbers);
جابه جایی روی آرایه با پوینتر
با جمع کردن، روی عناصر حرکت می کنیم: +1 یعنی عنصر بعدی.
int myNumbers[4] = { 25, 50, 75, 100 };
printf("%d\n", *(myNumbers + 1));
printf("%d\n", *(myNumbers + 2));
int myNumbers[4] = { 25, 50, 75, 100 };
int* ptr = myNumbers;
int i;
for (i = 0; i < 4; i++) {
printf("%d\n", *(ptr + i));
}
تغییر مقدار عناصر با پوینتر
می توانیم مقدار عناصر را هم با پوینتر عوض کنیم.
int myNumbers[4] = { 25, 50, 75, 100 };
*myNumbers = 13;
*(myNumbers + 1) = 17;
printf("%d\n", *myNumbers);
printf("%d\n", *(myNumbers + 1));
گام های عملی
- یک آرایه بساز.
- آدرس عنصرها را چاپ کن.
- با * مقدار عنصر اول را بگیر.
- با +n به عنصرهای بعدی برو.
- یک پوینتر بساز و حلقه بزن.
هشدار: حواست باشد؛ آدرس اشتباه می تواند داده دیگر را خراب کند.
برای مطالعه «پوینتر» و «آرایه ها» سر بزن. ادامه «پوینتر و آرایه ها» در مبحث محاسبات پوینتر است.
جمع بندی سریع
- نام آرایه، آدرس عنصر صفر است.
*مقدار آدرس را می خواند.- با
+nروی آرایه حرکت کن. sizeofاندازه حافظه را نشان می دهد.- بااحتیاط تغییر بده.