انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: 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;
}
چند ساعت بعد جواب رو میذارم.
-
خیلی عجیبه این کد دومی!
-
من با دستور printf آشنایی ندارم ولی هرچی هست زیر سر خودشه چون با cout جواب نمیده
-
یعنی [] در C عملگر نیست! operator
-
فکر کنم چون ارایه یه اشاره گره و فقط آدرس میده (ادرس سوم) با (سومین ادرس) یکیه هردوتاش
البته فکر میکنم
کلا کده جالبی بود دومیش ;D
-
بله پاسخ جناب abbasalim تا حدود زیادی درست بود ;)
قضیه از این قراره که نام آرایه اشاره گری به اولین عنصر آرایه هست. ما میتونیم به بقیه اعضای آرایه به دو صورت دسترسی داشته باشیم:
array[n]
*(array+n)
از اونجا که 2+5 با 5+2 برابر هست، میتونیم این شکلی هم عمل کنیم:
*(n+array)
هر وقت کامپایلر عملگر [n] رو دید، سعی میکنه اندازه نوع داده آرایه رو در n ضرب کنه و با نام آرایه (که اشاره اگری به اولین عنصر هست) جمع کنه. به همین دلیل روش دوم هم کار میکنه:
3[array]
در حقیقت کد بالا از نظر کامپایلر به این صورت هست:
array + (size*n)
در حالی که:
array[n]
از نظر کامپایلر به این صورت هست:
array + (n*size)
(یا برعکس)
نتیجه کلی:
استفاده از اشاره گر برای دسترسی به اعضای آرایه سرعت بیشتری داره، چون کامپایلر برای به دست آوردن اندیس آرایه فقط کافیه یه عمل جمع انجام بده، اما در هنگام استفاده از عملگر [] محبوره علاوه بر عمل جمع، یه عمل ضرب اضافه هم انجام بده ;)
-
a[b] == b[a] == *(a+b)
اصلاً کامپایلر کاری نداره این a و b آرایه هستن یا رشته یا عدد ثابت. یا مثلاً اگه a آرایه هست، طولش چقدره و ... چون سی یک زبان سطحپایین هست.