PDA

View Full Version : سوال: مشکل با مقدار دهی مجدد رشته ی اشاره گر



moha//\\//\\ad
پنج شنبه 30 مرداد 1393, 20:14 عصر
چرا پس از مقدار دهی اولیه یک رشته با اشاره گر ، نمی تونیم به شکل زیر مقدار دهی کنیم ؟ و اینکه چرا خطای زیر رو میزنه ؟ من که ثابت تعریف نکردم؟ (میدونم شکل درستش a=”reza”هست)
Char *a=”ali”;*a=”ila”//-> error C2440: '=' : cannot convert from 'const char [4]' to 'char'

omid_kma
پنج شنبه 30 مرداد 1393, 20:41 عصر
داخل مثالی که زدید a یک آدرس از نوع char هست و عملگر * به محتوای اون آدرس اشاره می کنه پس *a از نوع char هست .
شما نمیتونید char رو با آرایه مساوی بگزارید.
کد شما به همین دلیلی ارور میده که این کد ارور میده :

char a="ila";

ciavosh
پنج شنبه 30 مرداد 1393, 22:03 عصر
تعریف رشته به صورت
char *str="somestring" امکانی به صورت استثنا برای تعریف رشته است. در نتیجه پس از تعریف دیگر نمی توانید بنویسید
str="kadu" یا
*str="kadu"

moha//\\//\\ad
جمعه 31 مرداد 1393, 02:11 صبح
داخل مثالی که زدید a یک آدرس از نوع char هست و عملگر * به محتوای اون آدرس اشاره می کنه پس *a از نوع char هست .
شما نمیتونید char رو با آرایه مساوی بگزارید.
کد شما به همین دلیلی ارور میده که این کد ارور میده :

char a="ila";


از راهنماییتون ممنونم
سوالی که اینجا پیش میاد اینه که پس سیستم چجوری تشخیص میده که a اینجا یه رشته است؟


اما اگه متغییری به شکل زیر تعریف کنیم با عوض کردنش فقط یک کاراکتر در اون جای میگیره؟
cahr b;
یعنی در هر دو حالتی که ما رشته تعریف کردیم و یک کاراکتر تعریف کردیم به یک شکل مقدارشون پس از تعریف عوض اما چجوری تشخیص میده که اولی رشته اس و دومی کاراکتر؟
char a="ali"
char b='a'

بعد نکته ی دیگه ای که وجود داره خطایی که داده گفته نمیتونم مقدار ثابت!!!!!!!!؟ چرا ثابت؟ و اینکه چرا نوشته خانه ی چهارم؟
مثالتون خوب بود اما ارتباطش رو متوجه نشدم

rahnema1
جمعه 31 مرداد 1393, 22:01 عصر
سوال: char در حافظه چه قدر جا اشغال می کنه؟ جواب 1 بایت و میتونه اعداد 0 تا 255 را در خودش بگیره در واقع char یک نوع عدد صحیح هست و همچنین مثلا 'm' در کامپیوتر به صورت عدد 109 ذخیره میشه یعنی چه بنویسیم

char a=109;
یا
char a='m';

فرقی نمی کنه
سوال : * char چه قدر جا اشغال می کنه؟ جواب به اندازه long که در سیستم 32 بیتی میشه 4 بایت یا در 64 بیتی میشه 8 بایت. چون اشاره گره و قراره آدرس را در خودش نگه داره
سوال: آرایه char یا []char چه قدر جا اشغال می کنه؟ به تعداد عناصر موجود در حافظه جا اشغال می کنه مثلا [8]char یعنی آرایه کاراکتر که 8 بایت جا اشغال کرده

در استاندارد زبان c اشاره کرده که وقتی می نویسیم

char *a= "mohamad";

a یک اشاره گر به char خواهد بود که به آرایه ای از char اشاره می کنه که طول آن هم 8 خواهد بود ( به علت اینکه یک صفر به انتهای رشته اضافه خواهد شد) البته تغییر در آرایه منجر به اشتباه میشه undefined
یک نکته مهم اینه که آرایه میتونه به اشاره گر تبدیل بشه در این صورت اشاره گر به عنصر ابتدایی آرایه اشاره خواهد کرد
یعنی در عبارت بالا آرایه ای از char با محتوای "mohamad" وجود داشته با این انتساب آدرس خانه ابتدایی آرایه گرفته میشه و به a اختصاص داده میشه
این کد به زبان c

#include <stdio.h>
int main()
{
char a='m';
char b[]="mohammad";
char *c="mohammad";
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(b));
printf("%d\n",sizeof(c));
}

اما وقتی شما می نویسید

char a="mohammad";

قراره چی به چی تبدیل بشه؟ سمت راست یک آرایه دارید که گفتیم می تونه به اشاره گر تبدیل بشه
در سمت چپ هم char داریم که عدد می گیره حالا یا به صورت مثلا 109 یا 'm'
یک نکته دیگه اشاره گر می تونه به عدد صحیح تبدیل بشه که در نتیجه میتونه به char تبدیل بشه
یعنی آدرس خانه ابتدایی آرایه گرفته میشه به یک عدد صحیح تبدیل میشه و داخل charریخته میشه که معمولا این عدد از 255 بزرگتره در نتیجه یک عدد به درد نخور در char ذخیره میشه

مطالب بالا در مورد زبان c بود . در ++c قضیه کمی متفاوته
در استاندارد سی پلاس پلاس اشاره کرده

char *a= "mohamad";

که "mohamad" یک آرایه const از char هست
همچنین تبدیل اشاره گر به نوع صحیح باید به صورت صریح در ++c انجام بشه مثلا به این صورت میشه cast کرد

char a = (unsigned long) "ali";

اما چون حجم char کمه در نتیجه به جای اینکه آدرس در a ذخیره بشع یک عدد به درد نخور در اون دخیره می شه
و [4]const char یعنی آرایه ای ثابت از char با 4 عنصر

moha//\\//\\ad
شنبه 01 شهریور 1393, 18:05 عصر
سوال : * char چه قدر جا اشغال می کنه؟ جواب به اندازه long که در سیستم 32 بیتی میشه 4 بایت یا در 64 بیتی میشه 8 بایت. چون اشاره گره و قراره آدرس را در خودش نگه داره

چرا به اندازه ی long?
مگه اینطور نیست که اشاره گر به هر نوع داده ای به اندازه ی اون نوع داده فضا اشغال میکنه؟
یا اینکه به معماری سیستم برمیگرده که چقدر ادرس دهی داشته باشه؟ و به اون میزان آدرس ها طول داشته باشن؟

ciavosh
شنبه 01 شهریور 1393, 18:30 عصر
چرا به اندازه ی long?
مگه اینطور نیست که اشاره گر به هر نوع داده ای به اندازه ی اون نوع داده فضا اشغال میکنه؟
یا اینکه به معماری سیستم برمیگرده که چقدر ادرس دهی داشته باشه؟ و به اون میزان آدرس ها طول داشته باشن؟

اول اینکه long long نباید باشه؟ تو استاندارد جدید عوض شده؟

در جواب اینکه طبیعتاً اندازه اشاره گر طول آدرس حافظه است در معماری حاضر.

rahnema1
شنبه 01 شهریور 1393, 21:29 عصر
چرا به اندازه ی long?
مگه اینطور نیست که اشاره گر به هر نوع داده ای به اندازه ی اون نوع داده فضا اشغال میکنه؟
یا اینکه به معماری سیستم برمیگرده که چقدر ادرس دهی داشته باشه؟ و به اون میزان آدرس ها طول داشته باشن؟

چون long در سیستم 32 بیتی 4 بایت و در 64 بیتی 8 بایته
اشاره گر به char و double و int و .. همه شون به یک میزان جا اشغال می کنند

rahnema1
شنبه 01 شهریور 1393, 21:31 عصر
اول اینکه long long نباید باشه؟ تو استاندارد جدید عوض شده؟

در جواب اینکه طبیعتاً اندازه اشاره گر طول آدرس حافظه است در معماری حاضر.

long long در هر سیستم برابر 8 بایته

ciavosh
شنبه 01 شهریور 1393, 21:37 عصر
long long در هر سیستم برابر 8 بایته

روی سیستم من long همیشه 4 بایته.

motherboard
شنبه 01 شهریور 1393, 21:44 عصر
روی سیستم من long همیشه 4 بایته.
long با long long فرق می کنه.میشه گفت دوبل میشه.

rahnema1
شنبه 01 شهریور 1393, 21:57 عصر
روی سیستم من long همیشه 4 بایته.

بستگی به پیاده سازی داره
اینجا را ببینید:
http://en.cppreference.com/w/cpp/language/types
مگه سیستم شما چند بیتیه؟

motherboard
شنبه 01 شهریور 1393, 22:01 عصر
بستگی به پیاده سازی داره
ربطی به سیستم عامل نداره.کلا long با long long فرق می کنه.

rahnema1
شنبه 01 شهریور 1393, 22:06 عصر
ربطی به سیستم عامل نداره.کلا long با long long فرق می کنه.

با ciavosh بودم که گفتم ( سوء تفاهم نشه :))