PDA

View Full Version : تفاوت CONST char * str و char * str



ayub_coder
چهارشنبه 03 مهر 1392, 19:53 عصر
با سلام
می خواستم بپرسم تفاوت

CONST char *str;

و

char * str;


تو چی هست؟ اینها به چه معنا هستن و چه تفاوتی دارن؟

fjm11100
چهارشنبه 03 مهر 1392, 20:11 عصر
تفاوتشون توی const است! که برای تعریف ثابت ها بکار میره

ayub_coder
پنج شنبه 04 مهر 1392, 09:25 صبح
مگر این نیست که وقتیconst باشه نمیشه چیزی رو تغییر داد؟ پس چرا میتونم مقادیر این const رو در طول برنامه تغییر بدم؟
پس عملکرد const اینجا چی میشه؟

mehdi.mousavi
پنج شنبه 04 مهر 1392, 09:44 صبح
مگر این نیست که وقتیconst باشه نمیشه چیزی رو تغییر داد؟ پس چرا میتونم مقادیر این const رو در طول برنامه تغییر بدم؟ پس عملکرد const اینجا چی میشه؟

سلام.
const char *p در واقع pointer ای به اسم p تعریف می کنه که به char ای اشاره کنه که اون char از طریق این pointer قابل تغییر نیست؛ اما خود pointer قابل تغییر هستش. const char * const p احتمالا اون چیزی هستش که مد نظرتونه. اینجا هم p ثابته، هم اینکه از طریق p نمیتونید اون char رو تغییر بدید. البته یه حالت دیگه هم وجود داره و اون char * const p هستش. اینجا pointer ثابته، اما می تونید از طریق این Pointer ثابت مقدار اون char رو تغییر بدید. :)

موفق باشید.

ayub_coder
پنج شنبه 04 مهر 1392, 14:46 عصر
const char *p در واقع pointer ای به اسم p تعریف می کنه که به char ای اشاره کنه که اون char از طریق این pointer قابل تغییر نیست؛
یعنی مقدار اگه
CONST char *str = "Hello World";




در ادامه مقدار str رو تغییر بدیم و بنویسیم

str = "Good bye world";



این باید خطا بده دیگه؟
خطا نمیده و مقدار تغییر میکنه.

یعنی منظور شما اینه اگه یه پوینتر دیگه تعریف کنیم و نمیشه این رو به اون انتصاب داد؟ آره؟


CONST char *str = "Hello World";
char *var2="Another String" ;

//منظورتون اینه نمیشه اینکارو کرد؟
str = var2;


اون const اونجا چیکاره است؟??

mehdi.mousavi
جمعه 05 مهر 1392, 05:21 صبح
سلام.
به کد زیر دقت کنید:

const char *p = "Hello World";
p = "Good bye world";


اینجا، پس از اجرای خط اول، p به آدرس فرضا، 0x013f4454 اشاره می کنه. اما پس از اجرای خط دوم، اگر آدرس p رو مجددا نگاه کنید، متوجه میشید که اون آدرس به (فرضا) 0x013f4464 تغییر پیدا کرده. پس اینجا شما محتوای p رو عوض نکردید، بلکه از p خواستید تا به جای دیگه ای در حافظه اشاره کنه. و این، همون چیزی هستش که گفتم. در واقع شما باید کد رو بدین شکل می نوشتید:

const char *p = "Hello World";
p[0] = 't';

و بدین ترتیب، Compiler بهتون Error زیر رو میده:

error C3892: 'p' : you cannot assign to a variable that is const

اینجاست که اون const جلوی compile شدن برنامه رو میگیره، چون میبینه شما دارید محتوای جایی که p بهش اشاره می کنه رو تغییر میدید.

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

موفق باشید.

ayub_coder
جمعه 05 مهر 1392, 09:36 صبح
پس رشته ها در C به خودی خود به عنوان یه متغییر که آدرسی در حافظه دارن در نظر گرفته میشن درسته؟

ببخشید اینقد سوال میکنم. چون شما هر چیزی توضیح میدید من اونو می نویسم و تست میکنم. :-)

خوب با Const درسته کامپایلر ایراد میگره و نمیذاره تغییرش بدم. ولی بدون const برنامه اجرا میشه ولی با یک خطایی که معلوم نیست چیه (مثل dont send) به پایان میرسه. با کد زیر

char *p = "Hello world";
p[2] = 'h';

omidshaman
جمعه 05 مهر 1392, 10:17 صبح
عبارت هایی مثل "qwe" (عبارت بین "" ) توی C++‎ بهشون می گن string literal که یکی از ویژگی هاشون اینه که غیر قابل تغییرن برای همین کد شما نتیجش غیر قابل پیش بینیه و برنامه ارور میده.
برای این که بتونی مقدارشو عوض کنی باید این string literal رو داخل یک آرایه کپی کنی به این شکل مثلا


char p[] = "Hello world"; p[2] = 'h';

ayub_coder
جمعه 05 مهر 1392, 10:34 صبح
عبارت هایی مثل "qwe" (عبارت بین "" ) توی C++‎ بهشون می گن string literal که یکی از ویژگی هاشون اینه که غیر قابل تغییرن برای همین کد شما نتیجش غیر قابل پیش بینیه و برنامه ارور میده.
برای این که بتونی مقدارشو عوض کنی باید این string literal رو داخل یک آرایه کپی کنی به این شکل مثلا


char p[] = "Hello world"; p[2] = 'h';

مشکل من هم دقیقا تو بخش اشاره گر هاست :چشمک:

omidshaman
جمعه 05 مهر 1392, 10:47 صبح
مشکل من هم دقیقا تو بخش اشاره گر هاست :چشمک:
با چه قسمتیش مشکل داری؟

ayub_coder
جمعه 05 مهر 1392, 11:01 صبح
توی پست 7 گفتم

mehdi.mousavi
جمعه 05 مهر 1392, 11:49 صبح
پس رشته ها در C به خودی خود به عنوان یه متغییر که آدرسی در حافظه دارن در نظر گرفته میشن درسته؟

String Literal ها، بر اساس استاندارد، باید در بخش Read-Only حافظه ذخیره بشن. به بیان دیگه، عبارت Hello World شما باید در ROM ذخیره بشه و قابل تغییر نباشه. اما استانداردها رو همه تولید کنندگان Compiler به یک شکل بهش توجه نمیکنن، ممکن هستش شرکتی این امکان رو نادیده گرفته باشه و از همون اول، رشته مربوطه رو در حافظه خواندنی-نوشتنی ذخیره کرده باشه. در نتیجه، کد شما روی سیستم عاملی که با فلان Compiler کامپایل شده کار میکنه، روی سیستم عاملی دیگه ای Binary مورد نظر Crash می کنه. بنابراین، برای اینکه کد Portable باشه و چنین مشکلاتی پیش نیاد، بهتره همواره Pointer به String Literal ها رو const تعریف کنید که اگر حتی اشتباها خواستید محتوای اونو تغییر بدید، Compiler جلوی این مساله رو بگیره و کار به Runtime کشیده نشه. تا جاییکه من اطلاع دارم، از VS.NET 2003 به بعد، Microsoft در Visual Studio، مقادیر مزبور رو با تایپ صحیحی نگهداری میکنه در نتیجه، کدی که نوشتم منجر به Access Violation (یا بطور دقیق تر، Undefined Behavior) میشه.



ببخشید اینقد سوال میکنم. چون شما هر چیزی توضیح میدید من اونو می نویسم و تست میکنم. :-)

مشکلی نیست، من در خدمتم.


خوب با Const درسته کامپایلر ایراد میگره و نمیذاره تغییرش بدم. ولی بدون const برنامه اجرا میشه ولی با یک خطایی که معلوم نیست چیه (مثل dont send) به پایان میرسه.

این معلوم نیست، همون Undefined Behavior هستش. درسته، معلوم نیست.

موفق باشید.