۲۶-شهریور-۱۳۸۵, ۱۷:۲۷:۳۱
صفحهها: 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 هست .
در واقع با کمک اشاره گر ها می تونیم بصورت غیر مستقیم به متغیر ها در حافظه دسترسی داشته باشیم !
ببین در رابطه با اشاره گر ها دوتا مطلب هست که باید بدونی :
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- است؟
;int *p,s
;s = 5
p = &s;
printf("%d",p);
و نتيجه گرفتم:32-
ايا ادرس s مساوي 32- است؟
۲۶-شهریور-۱۳۸۵, ۲۱:۵۶:۵۷
دوست عزیز ، من توی همون تاپیک که مطرح کرده بودی جوابش رو داده بودم :
http://forum.iranvig.com/showthread.php?tid=4633
http://forum.iranvig.com/showthread.php?tid=4633
۲۶-شهریور-۱۳۸۵, ۲۳:۲۹:۲۸
نه
۲۷-شهریور-۱۳۸۵, ۰۰:۵۳:۰۲
sh_teta نوشته است:نه
۲۷-شهریور-۱۳۸۵, ۱۴:۰۰:۲۴
من منظورم اين نيست كه چرا اين عدد منفي هست مي خوام بدونم ايا واقعا ادرس اين متغير 32- است حالا شما ميشه لطف كنيد جواب اينو بديد.
من يه كد نوشتم.اينه:
;int *p,s
;s = 5
p = &s;
printf("%d",p);
و نتيجه گرفتم:32-
ايا ادرس s مساوي 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);
}
۲۷-شهریور-۱۳۸۵, ۲۰:۱۴:۰۳
اخه من نمي فهمم وقتي ميگي dl% يه چيز چاپ مي كنه وقتي ميگي u% يه چيز ديگه .بالاخره بايد به كدوم اعتماد كرد
۲۷-شهریور-۱۳۸۵, ۲۰:۳۶:۲۵
الان مشکل شما کجاست ؟؟ من که همه اش رو توضیح دادم ، علتش هاش رو هم گفتم . واسه کار شما هم راه حل ارائه کردم . کدت هم تصحیح شد .
میتونم یک سوال بپرسم ؟! اونم اینکه آیا شما میدونی چرا ما اصلا اعداد signed و unsigned داریم یا اینکه چرا کامپایلر به ما این امکانات رو داده ؟
میتونم یک سوال بپرسم ؟! اونم اینکه آیا شما میدونی چرا ما اصلا اعداد signed و unsigned داریم یا اینکه چرا کامپایلر به ما این امکانات رو داده ؟
صفحهها: 1 2