ايران ويج

نسخه‌ی کامل: اشاره گر (تورو خدا كمك كنيد)
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
ميشه بگيد & و * در اشاره گر دقيقا چكار مي كنن
جواب سوال قبليمو كسي بلد نيست؟
دوست من سلام

ببین در رابطه با اشاره گر ها دوتا مطلب هست که باید بدونی :
1
-آدرسی که یک اشاره گر به اون اشاره می کنه مثلا آدرس یک متغیر دیگه
2-محتویات اون چیزی که یک اشاره گر بهش اشاره می کنه ( دسترسی غیر مستقیم ) !

مثال : یک اشاره گر به اسم a و از نوع integer در نظر بگیر . خوب در حال حاضر اشاره گر شما به یک جای نامعلوم ( آدرس نامعلوم ) در حافظه اشاره می کنه و محتویات حافظه ای که بهش اشاره می کنه نا معلوم هست !

خوب حالا میایم و متغیر با نام k در نظر بگیر و مقدار 2 رو مثلا توش بذار ! حالا دوست داریم که اشاره گر اولمون a به متغیر k اشاره کنه ! خوب راهش اینه که آدرس متغیر k رو توی a بریزیم . با کمک & (عملگر آدرس ) آدرس k رو توی a میریزم : a=&k
در این حالت a به آدرس k اشاره می کنه ! حالا سوال اینه که محتویاتی که a بهش اشاره می کنه چیه ؟ خب دیقا همون محتویات متغیر k هست . برای دسترسی به مقدار متغیر k از طریق اشاره گر a باید از عملگر * استفاده کنیم . مثلا میخوایم مقدارش رو چاپ کنیم ، می نویسیم : (printf("%d",*a
این خط کد دقیقا برابر (printf("%d",k هست .

در واقع با کمک اشاره گر ها می تونیم بصورت غیر مستقیم به متغیر ها در حافظه دسترسی داشته باشیم !



خيلي ممنونم
من يه كد نوشتم.اينه:
;int *p,s
;s = 5
p = &s;
printf("%d",p);
و نتيجه گرفتم:32-
ايا ادرس s مساوي 32- است؟
دوست عزیز ، من توی همون تاپیک که مطرح کرده بودی جوابش رو داده بودم :

http://forum.iranvig.com/showthread.php?tid=4633
نه
sh_teta نوشته است:نه

Amaze Amaze Amaze
من منظورم اين نيست كه چرا اين عدد منفي هست مي خوام بدونم ايا واقعا ادرس اين متغير 32- است حالا شما ميشه لطف كنيد جواب اينو بديد.

من يه كد نوشتم.اينه:
;int *p,s
;s = 5
p = &s;
printf("%d",p);
و نتيجه گرفتم:32-
ايا ادرس s مساوي 32- است؟
نقل قول: مي خوام بدونم ايا واقعا ادرس اين متغير 32- است

مطمعنا نه ! آدرس عددی است مثبت و صحیح . علت منفی شدنش رو که برات توضیح دادم . برای تصحیح کدت باید بجای d% توی تابع printf ، مقدار u% قرار بدی تا کامپایلر آدرس درست رو برات چاپ کنه . در واقع d% به کامپایلر میگه که عددی صحیح و علامتدار رو چاپ کنه ( که با توجه به توضیحاتی که درباره بیت علامت داده بودم برات ) ممکنه عددت منفی بشه و آدرس درست چاپ نشه . وقتی u% بکار ببری به کامپایلر میگی که بیت علامت بی بیت علامت ( یعنی با عدد من مثل یک عدد بدون علامت یا Unsigned برخورد کن )  پس عددی مثبت ( آدرس ) واست چاپ میشه !
بری فهم بیشتر کدهای زیر رو تست کن تا بهتر مطلب رو بگیری :

وقتی d% بکار ببری :

کد:
#include <stdio.h>
int main()
{
int *a;
a = (int *)0xFFFFFFFFF;

printf("%d",a);

}

وقتی u% بکار ببری :

کد:
#include <stdio.h>
int main()
{
int *a;
a = (int *)0xFFFFFFFFF;

printf("%u",a);

}

Cool
اخه من نمي فهمم وقتي ميگي dl% يه چيز چاپ مي كنه وقتي ميگي u% يه چيز ديگه .بالاخره بايد به كدوم اعتماد كرد
ConfusedConfusedConfused الان مشکل شما کجاست ؟؟ من که همه اش رو توضیح دادم ، علتش هاش رو هم گفتم . واسه کار شما هم راه حل ارائه کردم . کدت هم تصحیح شد . Sad
میتونم یک سوال بپرسم ؟! اونم اینکه آیا شما میدونی چرا ما اصلا اعداد signed و unsigned داریم یا اینکه چرا کامپایلر به ما این امکانات رو داده ؟
صفحه‌ها: 1 2