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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: fond در 01 خرداد 1392، 06:55 ب‌ظ

عنوان: سوال جالب درباره آرایه در C و ++C
ارسال شده توسط: fond در 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;
}

چند ساعت بعد جواب رو میذارم.
عنوان: پاسخ : سوال جالب درباره آرایه در C و ++C
ارسال شده توسط: امیرمسعود در 01 خرداد 1392، 07:32 ب‌ظ
خیلی عجیبه این کد دومی!
عنوان: پاسخ : سوال جالب درباره آرایه در C و ++C
ارسال شده توسط: MHA152 در 01 خرداد 1392، 07:56 ب‌ظ
من با دستور printf آشنایی ندارم ولی هرچی هست زیر سر خودشه چون با cout جواب نمیده
عنوان: پاسخ : سوال جالب درباره آرایه در C و ++C
ارسال شده توسط: alend در 02 خرداد 1392، 09:08 ق‌ظ
یعنی [] در C عملگر نیست! operator
عنوان: پاسخ : سوال جالب درباره آرایه در C و ++C
ارسال شده توسط: abbasalim در 02 خرداد 1392، 09:16 ق‌ظ
فکر کنم چون ارایه یه اشاره گره و فقط آدرس میده (ادرس سوم) با (سومین ادرس) یکیه هردوتاش
البته فکر میکنم
کلا کده جالبی بود دومیش ;D
عنوان: پاسخ : سوال جالب درباره آرایه در C و ++C
ارسال شده توسط: fond در 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)

(یا برعکس)


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