اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

تغییر نوع اشاره‌گرها

+1 امتیاز
432 نمایش

می‌دونیم که اگه یه داده‌ی صحیح بزرگ رو به داده‌ی صحیح کوچک‌تر تبدیل کنیم احتمال از دست رفتن اطلاعات هست. مثلاً


long int x;
int y;
cin>>x;
y = x;

فهمیدن این که این اتفاق چطوری می‌افته و کدوم قسمت اطلاعات از دست می‌ره وحتی نتیجه‌ی این عملیات چه عددی هست با یه کم اطلاعات کامپیوتری قابل حله.
حالا من جدیداً دیدم که اشاره‌گرها هم تبدیل نوع دارن. یه دستور مثل زیر کاملاً مجازه

int y;
int *ip = &y;
int *sp = (short *)ip;

خب اینجا هم طبیعتاً باید همین از دست رفتن داده‌ها باشه دیگه. یانه؟
یک مشکل در مورد C++ این است که هم‌اکنون گرایشی قوی در زبان وجود دارد که شما را وادار می‌کند پیش از انجام هر کاری، همه‌ی جوانب آن را بدانید. (Larry Wall)
پرسیده شده جمعه ۳ آذر ۱۳۹۱ در C++ توسط CPP_Crawler2  
بازتگ شده جمعه ۲۳ فروردین ۱۳۹۲ توسط admin

احتمالاً منظور short int *sp باشه نه int *sp.

2 پاسخ

0 امتیاز
 
بهترین پاسخ

بله این تبدیل قابل انجام هست و کامپایل و اجرا هم می‌شه منتها با همون تغییر ‍int *sp به short int *sp. برای این تبدیل حداقل دو حالت زیر وجود داره

#include <iostream>
using namespace std;

int main()
{
  int *pi;
  short int i;
  void *vi = &i;
  pi = (int *)vi;
  cout<<*pi;
  return 0;
}

یا

#include <iostream>
using namespace std;

int main()
{
  int *pi;
  short int i;
  short int *si = &i;
  pi = (int *)(sp);
  cout<<*pi;
  return 0;
}

اطلاعات در این‌جا هم تغییر می‌کنه. تغییر اشاره‌گر از انواع مختلف به همدیگه وجود داره. مثلاً صحیح به اعشاری یا برعکس.

در صورتی که اشاره‌گر یک عدد صحیح به عدد صحیح کوچک‌تر تبدیل بشه بایت‌های ابتدایی مورد اشاره در مقدار محاسبه می‌شه.
مثلاً فرض کنیم اشاره‌گر int* به بایت ۱۰۰ حافظه اشاره کنه. بنابراین در محاسبه‌ی مقدار بایت‌های ۱۰۰ و ۱۰۱ و ۱۰۲ و ۱۰۳ مورد استفاده هستند. حالا اگه اشاره‌گر به short int* تبدیل بشه اون وقت در محاسبه بایت‌های ۱۰۰ و ۱۰۱ محاسبه می‌شن. (در صورتی که int ۴ بایتی و short int ۲ بایتی باشه).

در صورتی که اشاره‌گر یک عدد صحیح به عدد صحیح بزرگ‌تر تبدیل بشه بایت‌های اضافی از انتهای بایت‌های عدد در محاسبه‌ی مقدار مورد استفاده قرار می‌گیره.

در صورتی که تغییر اشاره‌گر از بدون علامت به علامت‌دار یا برعکس انجام بشه، تفسیر بیت‌های عدد تغییر می‌کنه نه بایت‌های مورد استفاده.

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده سه شنبه ۲۱ خرداد ۱۳۹۲ توسط prodo  
انتخاب شده سه شنبه ۲۱ خرداد ۱۳۹۲ توسط admin
–1 امتیاز

تا جایی که من میدونم همچین دستوری مجاز نیست.
فقط در یه صورت خاص میشه نوع اشاره‌گر رو عوض کرد و اونم در صورتیه که اونو * void تعریف کنید.

پاسخ داده شده دوشنبه ۱۶ بهمن ۱۳۹۱ توسط CPP_Crawler4  

روش‌های زیادی برای تبدیل اشاره‌گر هست