PDA

View Full Version : تفاوت char* a و char *a ؟



moha//\\//\\ad
جمعه 31 مرداد 1393, 02:06 صبح
آیا در تعاریف زیر تفاوتی وجود دارد؟

Char* a
Char *a

این سوال رو از این بابت میپرسم که در برخی تبدیلات دیدم که به این شکل تبدیل انجام شده
(int*)x
اما نمیتونم درکش کنم یعنی چی

rahnema1
جمعه 31 مرداد 1393, 08:45 صبح
نه تفاوتی وجود نداره
ببینید اصلش اینه که موقع اعلان یک متغیر به صورت اشاره گر
1-اول نوع را میذاریم و سپس
2- یک ستاره و اسپیس به همراه نام متغیر میذاریم
یعنی char یه طرف و ستاره و نام متغیر یعنی a طرف دیگه
با این کار نوع a برابر میشه با * char
یعنی نوعش میشه اشاره گر به char
این هم یک نمونه دیگه که چند تا متغیر اعلان می کنیم:

char * a , b , * c;

a از نوع اشاره گر به char
b از نوع char
c از نوع اشاره گر به char هستند
یک نکته دیگه چون * جزء حروفی نیست که به عنوان اسم متغیر ازشون استفاده می شه فرقی نمیکنه که قبل و بعدش اسپیس بذاریم یا نذاریم

char* a;
char *a;
char * a;
char*a;

در مورد آخر هم داره عمل cast یا تبدیل نوع انجام میشه مثلا وقتی بخواهیم یک int را به صورت صریح به double تبدیل کنیم می تونیم اینجور بنویسیم

int a=5;
int b=6;
double c= (double) a / b;

ابتدا a تبدیل به double میشه و بعد تقسیم بر b میشه
توی مثال شما هم داریم یک متغیر را به نوع اشاره گری به int یا * int تبدیل می کنیم

ciavosh
جمعه 31 مرداد 1393, 08:45 صبح
دو مورد اول تفاوتی ندارند.

مورد سوم به کامپایلر میگوید نوع متغیر x را "اشاره گر به عدد صحیح" در نظر بگیر.

int *a, b;
int* a,b;

در این مثال در هر دو تعریف a اشاره گر به متغیر عدد صحیح و b متغیر عدد صحیح می باشد.

{ویرایش}

یک نکته مهم اینکه استفاده از این نوع تبدیل نوع که به نام c-style cast شناخته میشه در ++C توصیه نمیشه و باید به جای آن از static_cast استفاده شود.

motherboard
جمعه 31 مرداد 1393, 09:56 صبح
یک نکته مهم اینکه استفاده از این نوع تبدیل نوع که به نام c-style cast شناخته میشه در ++C توصیه نمیشه و باید به جای آن از static_cast استفاده شود.
ممنون می شوم که این دو گزینه را تشریح کوتاهی بفرمایید.

ciavosh
جمعه 31 مرداد 1393, 10:43 صبح
مثال: به جای اینکه بنویسیم

void *t;
int *a = (int*) t
بنویسیم
void *t;
int *a = static_cast<int*>(t);


حال مثال دیگر:

void *t;
int a = (int) t;

این کد کامپایل و اجرا می شود. ولی دست کار نمیکند چون ما داریم ادرس یک متغیر نا معلوم را به عدد صحیح تبدیل و درون a قرار میدهسم در صورتی که مقصود ما قرار دادن مقدار آن در a بود. در اینجا اگر از static_cast استفاده میکردیم کامپایلر متوجه اشتباه ما میشد و خطا میداد.

moha//\\//\\ad
شنبه 01 شهریور 1393, 18:08 عصر
ممنون از راهنماییتون
میخوام بدونم در تبدیل نوع دقیقا چه اتفاقی میفته؟ یعنی ریزتر بشیم تو اجرای فرایند تبدیل که چه اتفاقی میفته که بعنوان مثال یک نوع int به اشاره گر اون تبدیل میشه

ciavosh
شنبه 01 شهریور 1393, 18:40 عصر
ممنون از راهنماییتون
میخوام بدونم در تبدیل نوع دقیقا چه اتفاقی میفته؟ یعنی ریزتر بشیم تو اجرای فرایند تبدیل که چه اتفاقی میفته که بعنوان مثال یک نوع int به اشاره گر اون تبدیل میشه

من ابتدا یه توضیح بدم اونم اینکه بعضی مباحثی که سوال میشه جوابش ممکنه در سطح پیشرفته باشه و نیاز روزمره برنامه نویس هم نباشه. مثل همین مورد. مثلاً من باید بدونم که تا حد امکان نباید نوع های داده ای را به هم تبدیل کنم. و به طور معمول همیشه باید از static_cast استفاده کنم. همچنین به جای define# از const استفاده کنم.
حال اینکه چگونه تبدیل نوع توسط کامپایلر صورت میگیره یکم پیشرفته تره. گاهی موارد هیچ تغییری در کد خروجی به وجود نمیاد و گاهی کد لازم توسط کامپایلر اضافه می شود.