پرسش و پاسخ سی پلاس پلاس بچه های پرومیکرز
دوشنبه, ۵ مرداد ۱۳۹۴، ۰۱:۵۸ ب.ظ
http://promakers.ir/showthread.php?tid=2891
number = zptr غلط هست. چون zptr یک pointer(اشاره گر)
هست و به آدرس نامعلومی از حافظه اشاره می کنه و آدرس ها چون بر مبنای hexa
decimal(مبنای شانزده) هستند نمیشه اونا رو در متغیر number که از نوع
دیگه ای(int) ذخیره کرد.
شما باید محتوای جایی که اشاره گر بهش اشاره می کنه رو بریزید توی متغیر number به این صورت :
++zptr درسته هم باعث میشه اشاره گر به خانه ی بعدی حافظه اشاره کنه(خود متغیر اشاره گر 2 بایت اشغال می کنه در CPP. اگه نوع int یا float باشه یعنی هر سلول به اندازه ی 2 بایت int یا 6 بایت float اشغال می کنه)
اگه بخواید با اشاره گر ها خانه های متوالی آرایه رو نشون بدید و چاپ کنید می تونید یه حلقه whie not null یا for بنویسید که هر بار به مقدار اشاره گر یکی اضافه کنه و سپس محتوای سلول مد نظر رو بخونه(برای خوندن محتوای جایی که اشاره گر بهش اشاره می کنه کافیه قبل از متغیر اشاره گر یک علامت ستاره بذاریم )
دستور زیر هم اشتباهه :
چون طبق تعریف داریم :
طبق کد فوق، zptr یک اشاره گر هست( که به سلول های نوع int اشاره می کنه)
پس نمیشه zptr[i] بنویسیم . باید اینطوری کد رو اصلاح کنی:
در مورد اشاره گرها می خوای بیشتر بدونی کتاب کنکور C مقسمی یا cpp پارسه رو بخون. PDF رایگان توی اینترنت ریخته.مشکلی بود بپرس
کد زیر هم مشکل داره(اشکال منطقی:یعنی ظاهرا مشکل ممکنه نداشته باشه اما ممکنه در لحظه ی کامپایل خطا بده):
دلیل :
num یک پواینتر(اشاره گر) هست و به فضای نوع int باید اشاره کنه.اما ما مشخص نکردیم به کجا اشاره کنه پس محتوای قسمتی از حافظه که آدرسش رو نمی دونیم داریم با cout به خروجی(console out=cout) می بریم و ممکنه خطاهایی دریافت کنیم یا یه محتوای غیر قابل فهم یا چند کاراکتر بیخود یا هنگ کنه برنامه.
پس باید ابتدا اشاره گ رو اشاره بدی به یک نوع(حتما int چون نوع اشاره گر ما int هست). مثال اینطوری :
کد زیر محتوای متغیر num رو با استفاده از اشاره گر p چاپ می کنه :
کدهای زیر هم غلط هستند:
زیرا متغیرهای result و numptr از نوع short int (نصف فضای int) هستند و
باید مقداردهی genericptr هم از همون نوع short باشه تا بینشون بتونیم
تبادل دیتا کنیم.
ضمنا اشاره گر از نوع void نداریم.یعنی نه اینکه نداریم داریم ولی محتوای جایی که اشاره گر از نوع void داره بهش اشاره می کنه رو نمی شه برگشت داد مگر اینکه تبدیل نوع یا Type cast (تبدیل نوع موقت) انجام بدیم و تبدیلش کنیم به short اینطوری:
منبع در مورد اشاه گر نوع void:
http://www.learncpp.com/cpp-tutorial/613-void-pointers/
شما باید محتوای جایی که اشاره گر بهش اشاره می کنه رو بریزید توی متغیر number به این صورت :
کد PHP:
number=*zptr
++zptr درسته هم باعث میشه اشاره گر به خانه ی بعدی حافظه اشاره کنه(خود متغیر اشاره گر 2 بایت اشغال می کنه در CPP. اگه نوع int یا float باشه یعنی هر سلول به اندازه ی 2 بایت int یا 6 بایت float اشغال می کنه)
اگه بخواید با اشاره گر ها خانه های متوالی آرایه رو نشون بدید و چاپ کنید می تونید یه حلقه whie not null یا for بنویسید که هر بار به مقدار اشاره گر یکی اضافه کنه و سپس محتوای سلول مد نظر رو بخونه(برای خوندن محتوای جایی که اشاره گر بهش اشاره می کنه کافیه قبل از متغیر اشاره گر یک علامت ستاره بذاریم )
دستور زیر هم اشتباهه :
کد:
for(i = 0 ; i <= 5 ;i++)
cout << zptr[i];
کد PHP:
int *zptr;
پس نمیشه zptr[i] بنویسیم . باید اینطوری کد رو اصلاح کنی:
کد PHP:
for(i = 0 ; i <= 5 ;i++)
{
cout << *(zptr);
zptr++;//zptr=zptr+1;
}
در مورد اشاره گرها می خوای بیشتر بدونی کتاب کنکور C مقسمی یا cpp پارسه رو بخون. PDF رایگان توی اینترنت ریخته.مشکلی بود بپرس
کد زیر هم مشکل داره(اشکال منطقی:یعنی ظاهرا مشکل ممکنه نداشته باشه اما ممکنه در لحظه ی کامپایل خطا بده):
کد:
int *num;
cout << *num;
num یک پواینتر(اشاره گر) هست و به فضای نوع int باید اشاره کنه.اما ما مشخص نکردیم به کجا اشاره کنه پس محتوای قسمتی از حافظه که آدرسش رو نمی دونیم داریم با cout به خروجی(console out=cout) می بریم و ممکنه خطاهایی دریافت کنیم یا یه محتوای غیر قابل فهم یا چند کاراکتر بیخود یا هنگ کنه برنامه.
پس باید ابتدا اشاره گ رو اشاره بدی به یک نوع(حتما int چون نوع اشاره گر ما int هست). مثال اینطوری :
کد زیر محتوای متغیر num رو با استفاده از اشاره گر p چاپ می کنه :
کد PHP:
int num=25;//یه عدد دلخواه
int *p;
p=&num// آدرس متغیر نامبر رو میریزه توی اشاره گر پی
cout<<*p;//محتوای جایی که پی بهش اشاره می کنه رو چاپ می کنه
کدهای زیر هم غلط هستند:
کد:
short * numptr,result;
void * genericptr = numptr;
result = * genericptr + 7;
ضمنا اشاره گر از نوع void نداریم.یعنی نه اینکه نداریم داریم ولی محتوای جایی که اشاره گر از نوع void داره بهش اشاره می کنه رو نمی شه برگشت داد مگر اینکه تبدیل نوع یا Type cast (تبدیل نوع موقت) انجام بدیم و تبدیلش کنیم به short اینطوری:
کد:
short * numptr,result;
void * genericptr = numptr;
result =(short *) genericptr + 7;//محتوای جایی که اشاره می کند را تبدیل به شورت کرده و با هفت جمع و در ریزالت می ریزد
منبع در مورد اشاه گر نوع void:
http://www.learncpp.com/cpp-tutorial/613-void-pointers/
لطفا سوالات در گروه یونیتی گیم اور که در کانال gameoverblog متعاقبا اعلام می گردد بپرسید.
با تشکر
https://telegram.me/gameoverblog
۹۴/۰۵/۰۵