انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: سوال جالب درباره آرایه در C و ++C  (دفعات بازدید: 1464 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین fond

  • Full Member
  • *
  • ارسال: 144
سوال جالب درباره آرایه در C و ++C
« : 01 خرداد 1392، 06:55 ب‌ظ »
سلام.

موقع خوندن یه مقاله به یه نکته برخوردم که فکر کنم برای شما هم جالب باشه. اما فقط می‌خوام شما هم در مورد کمی فکر کنید. کسی میتونه بگه چرا هر دو تا کد زیر درسته؟ (تنها تفاوت این دو تا توی فراخوانی تابع printf هست)

#include <stdio.h>

int main(int argc, char *argv[])
{
        int array[5];

        array[3] = 15;

        printf("%d\n", array[3]);

        return 0;
}


#include <stdio.h>

int main(int argc, char *argv[])
{
        int array[5];

        array[3] = 15;

        printf("%d\n", 3[array]);

        return 0;
}

چند ساعت بعد جواب رو میذارم.

آفلاین امیرمسعود

  • Sr. Member
  • *
  • ارسال: 373
  • جنسیت : پسر
پاسخ : سوال جالب درباره آرایه در C و ++C
« پاسخ #1 : 01 خرداد 1392، 07:32 ب‌ظ »
خیلی عجیبه این کد دومی!

آفلاین MHA152

  • High Hero Member
  • *
  • ارسال: 2745
  • جنسیت : پسر
  • من عاشق یونیکسی ها هستم
پاسخ : سوال جالب درباره آرایه در C و ++C
« پاسخ #2 : 01 خرداد 1392، 07:56 ب‌ظ »
من با دستور printf آشنایی ندارم ولی هرچی هست زیر سر خودشه چون با cout جواب نمیده
بهتون پیشنهاد می کنم به دنیای بزرگ شبه−یونیکس وارد بشید و از پیشرفت لذت ببرید
جیمیلم

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : سوال جالب درباره آرایه در C و ++C
« پاسخ #3 : 02 خرداد 1392، 09:08 ق‌ظ »
یعنی [] در C عملگر نیست! operator

آفلاین abbasalim

  • High Sr. Member
  • *
  • ارسال: 642
  • جنسیت : پسر
  • http://esfandune.ir/
    • اسفندونه
پاسخ : سوال جالب درباره آرایه در C و ++C
« پاسخ #4 : 02 خرداد 1392، 09:16 ق‌ظ »
فکر کنم چون ارایه یه اشاره گره و فقط آدرس میده (ادرس سوم) با (سومین ادرس) یکیه هردوتاش
البته فکر میکنم
کلا کده جالبی بود دومیش ;D

آفلاین fond

  • Full Member
  • *
  • ارسال: 144
پاسخ : سوال جالب درباره آرایه در C و ++C
« پاسخ #5 : 02 خرداد 1392، 10:08 ق‌ظ »
بله پاسخ جناب abbasalim تا حدود زیادی درست بود ;)

قضیه از این قراره که نام آرایه اشاره گری به اولین عنصر آرایه هست. ما میتونیم به بقیه اعضای آرایه به دو صورت دسترسی داشته باشیم:
array[n]
*(array+n)

از اونجا که 2+5 با 5+2 برابر هست، میتونیم این شکلی هم عمل کنیم:

*(n+array)
هر وقت کامپایلر عملگر [n] رو دید، سعی میکنه اندازه نوع داده آرایه رو در n ضرب کنه و با نام آرایه (که اشاره اگری به اولین عنصر هست) جمع کنه. به همین دلیل روش دوم هم کار میکنه:

3[array]
در حقیقت کد بالا از نظر کامپایلر به این صورت هست:
array + (size*n)
در حالی که:
array[n]از نظر کامپایلر به این صورت هست:
array + (n*size)

(یا برعکس)


نتیجه کلی:
استفاده از اشاره گر برای دسترسی به اعضای آرایه سرعت بیشتری داره، چون کامپایلر برای به دست آوردن اندیس آرایه فقط کافیه یه عمل جمع انجام بده، اما در هنگام استفاده از عملگر [] محبوره علاوه بر عمل جمع، یه عمل ضرب اضافه هم انجام بده  ;)
« آخرین ویرایش: 02 خرداد 1392، 10:14 ق‌ظ توسط fond »

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ : سوال جالب درباره آرایه در C و ++C
« پاسخ #6 : 02 خرداد 1392، 10:13 ب‌ظ »
a[b] == b[a] == *(a+b)اصلاً کامپایلر کاری نداره این a و b آرایه هستن یا رشته یا عدد ثابت. یا مثلاً اگه a آرایه هست، طولش چقدره و ... چون سی یک زبان سطح‌پایین هست.