اشارهگرها و آرایهها
رابطه نزدیک اشارهگرها و آرایهها، حساب اشارهگر و پیمایش آرایه با اشارهگر
رابطه اشارهگر و آرایه
در C نام آرایه عملاً آدرس عنصر اول آن است! پس اشارهگر و آرایه رابطه نزدیکی دارند:
int numbers[4] = {10, 20, 30, 40};
int *ptr = numbers; // بدون & — چون خود numbers آدرس است
printf("%d", *ptr); // 10 (عنصر اول)
printf("%d", numbers[0]); // 10 — همان!
دسترسی به عناصر با اشارهگر
printf("%d", *(ptr + 0)); // 10 — معادل numbers[0]
printf("%d", *(ptr + 1)); // 20 — معادل numbers[1]
printf("%d", *(ptr + 2)); // 30 — معادل numbers[2]
💡 numbers[i] در واقع همان *(numbers + i) است! کامپایلر براکت را به اشارهگر تبدیل میکند.
حساب اشارهگر (Pointer Arithmetic)
وقتی به اشارهگر عدد اضافه میکنید، به اندازه sizeof نوع جابهجا میشود نه یک بایت:
int *p = numbers; // آدرس عنصر ۰
p++; // حالا به عنصر ۱ اشاره میکند (۴ بایت جلو)
پیمایش آرایه با اشارهگر
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;
for (int i = 0; i < 5; i++) {
printf("%d ", *ptr);
ptr++; // حرکت به عنصر بعدی
}
مثال: جمع عناصر با اشارهگر
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += *(numbers + i);
}
اشارهگر و رشته
رشته هم آرایه است پس همین قواعد اعمال میشود:
char str[] = "Hello";
char *p = str;
while (*p != \x27\x5c0\x27) {
printf("%c", *p);
p++;
}
تفاوتهای مهم
| ویژگی | آرایه | اشارهگر |
|---|---|---|
| اندازه با sizeof | کل آرایه ✅ | فقط اندازه اشارهگر ❌ |
| جابهجایی (++) | نمیتوان ❌ | میتوان ✅ |
| تخصیص مجدد | نمیتوان ❌ | میتوان ✅ |
نکات مهم
arrو&arr[0]معادلاند- حساب اشارهگر فقط داخل محدوده آرایه معتبر است
- پیمایش با اشارهگر گاهی از اندیس سریعتر است (در کامپایلرهای قدیمی)
این مبحث بخشی از دوره آموزش کامل زبان C است.