[PHP]
void print (char * str)
{
*str= 'M';
}
int main () {
char *c = "text";
cout << c <<endl;
print (c);
cout << c << endl;
getch();
return 0;
}
[/PHP]
Printable View
[PHP]
void print (char * str)
{
*str= 'M';
}
int main () {
char *c = "text";
cout << c <<endl;
print (c);
cout << c << endl;
getch();
return 0;
}
[/PHP]
نمیدونه کسی آیا؟
اشکال در خط :
هست.کد:char *c = "text";
بهتره برای ایجاد یک رشته از کاراکتر ها همیشه از آرایه استفاده کنید مثل زیر:
در آرایه ها همیشه متغییر بدون اندیس به اولین عضو آرایه اشاره میکنه.اما در مورد اول, اشارگر به اشارگر آرایه نسبت داده میشه یعنی دو مرحله اشاره صورت میگیره که در نهایت در تابع سعی بر تغییر اشارگر میکنید که با کرش مواجه میشید.کد:char c[] = "text";
شما این دستور رو تماشا(!) کنید:
[PHP]
void Test(int *a){
*a=4;
}
int main(){
int c=9;
int *p=&c;
Test(p);
}[/PHP]
وقتی به فراخوانی تابع میرسه، میشه انتساب اشاره گرها. که آدرس موجود در p به درون a ریخته میشود و هر دو به یک نقطه (که همون C است) اشاره میکنند.
اما تو اون رشته ها:
مگه متغیر C دارنده ی آدرس اولین خونه رشته نیست؟ مگه موقع ارسال، انتساب اشاره گر ها صورت نمیگیره و Str تبدیل به یک نام دیگه برای اون محل حافظه نمیشه؟
کاملا درسته و علتش هم اینه که خود c یک اشارگر نیست!نقل قول:
وقتی به فراخوانی تابع میرسه، میشه انتساب اشاره گرها. که آدرس موجود در p به درون a ریخته میشود و هر دو به یک نقطه (که همون C است) اشاره میکنند.
در کد قبلی آدرس اشارگر در اشارگر دیگر قرار میگرفت.
شما در تابع توسط عملگر دسترسی به مقدار (*) به آدرس اشارگر که در واقع به عنوان مقدار (Value) در اشاگر دیگر ریخته شده دسترسی پیدا میکنید نه به حرف t یا اولین خانه از آرایه.
طبق تصویر:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اشکال کد اولتون استفاده غلط از اشاره گر هاست. در واقع از لحاظ ساختاری و ظاهری مشکل نداره . مشکل تویه پاس دادن متغییر ها نیست. مشکل تویه رم و ران تایم اتفاق میوفته.
برای اثبات این و تست کنید:
جالب بود ! نه ؟کد:#include<iostream>
using namespace std;
int main () {
char *c = "text";
cout << *c <<endl;
*c='s';
cout << *c <<endl;
cin >> *c;
return 0;
}
فرق int با رشته اینه که وقتی به int اشاره میکنید میشه کل 2بایت(اگه int رو 2بایتی در نظر بگیریم) ولی وقتی ب رشته اشاره میکنید میشه 1 char اولش. و حتما این و میدونید که محل اشاره گر و محلی که بهش اشاره میکنه جداست. تویه مثال قیلی اشاره گرها مورد نظر هستن نه رشته ای که اشاره میکنید. رشته میتونه 100 char باشه مثلا ولی اشاره گر فقط به خونه اول اشاره میکنه.
اول این کد و تست کنید تا بعد اگه لازم بود توضیح بدم.
کد:#include<iostream>
#include<string.h>
using namespace std;
void print (char *p)
{
*p='8';
}
int main () {
char cc[]="123456";
char *p;
p=cc;
cout <<*p <<"\n";
print(p);
cout<<*p;
cin >> *p;
return 0;
}
تشکر از هر دو دوست.
من چندین بار پستتون رو از اول تا آخر خوندم، ولی خب، مشکل IQ تو این زمونه شایع هستش.
توی تصویر زیر متغیر a دارای آدرس 16CC و اشاره گر هم دارای آدرس 12FC میباشد. ما با استفاده از عملگر * میگیم محتویات آدرسی که در تو هست رو نشون بده. مثلا cout << *p
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خب تصویر زیر هم توی c یه آدرسه. میخواهیم اون رو دیرفرنس کنیم و توش مقدار بریزیم.
[PHP]*c='a'[/PHP]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
راستی یه نکته. اون پنج بایت بالا بدون نام هستش دیگه؟
ممنون
خب تویه این کد دقیقا این اتفاق میوفته دیگه .
جای 1 ؛ 8 میذاره.
مشکل کجاست الان ؟کد:#include<iostream>#include<string.h>
using namespace std;
void print (char *p)
{
*p='8';
}
int main () {
char cc[]="123456";
char *p;
p=cc;
cout <<p <<"\n";
print(p);
cout<<p;
cin >> *p;
return 0;
}
مشکل اینجاست که آرایه مشکل نداره، ولی اشاره گر رشته ای مشکل داره. من میخوام به یه درکی برسم که چرا اشاره گر رشته ای و دیفرنس کردن و مقدار دادن متفاوته با آرایه ها.
همونطور که میدونید آرایه هم فرزند اشاره گرهاست (ولی خب استاتیک)
در ضمن یکی بگی این دو تا چیه هستن. تفسیر کنه، آیا اولیت عملگرها تو این دو تا رعایت میشه؟
[PHP]*&p
&*p[/PHP]
راستی شما بچه شمسی پور هستی؟
اشاره گر ها مشکلشون تویه گرفتن حافظه هست. وقتی تعریف میکنید :
1 اشاره گر دارید که به 1 جایی داره اشاره میکنه. حالا به کجا؟ نمیدونید. مشکل همین جاست. p شامل ادرس محلی است ؛ ک میتونه این ادرس در ناحیه داده یا کد برنامه باشه/نباشه. میتونه مثلا به 1 قسمت غیر مجاز اشاره کنه که با مقدار دهی بهش کل سیستم عامل کرش کنه(البته ویندوز اجازه دسترسی به قسمت های مخصوص و نمیده ولی با داس میشه این کارو کرد)کد:
int *p
خب حالا راه حلش جیه.
باید به اشاره کرتون درست حافطه اختصاص بدید.
مثلا:
یا مثلاکد:p=new int
تویه این مثال ها p به 1 مکان درست اشاره میکنه که مجاز هست .کد:
char cc[]="123456";char *p;p=cc;
به خاطر این مسایل+یه سری چیزا ؛ کلا استفاده از اشاره گر توصیه نمیسه. به خاطر همین ارور پذیری بالا که میبینید. کلا مبحث سنگین هست چون ویزگی شبیه به زبان های سطح پایین هست. به قولی: رمز استفاده درست از اشاره گر ها این ه که بدونید هر لحظه به کجا اشاره میکنه.
اونم با وجود این کامپایلرهای پیش پیش رفته امروزی دلیلی ببرای استفاده از اشاره گر نیست. اگر هم اصرار به استفاده دارید باید به طور مثال به اشکال بالا ازش استفاده کنید.
_______________
بله.نقل قول:
__________-
__________
برای سوال اخرت هم این و ببین:
دوست عزیز، لینک هایی که دادید رو دارم با دقت میخوونم.
همین الان یه سوال پیش اومد. اگه کامپیوتر یک شخص 12 گیگ حافظه داشته باشه، با توجه به واحد حافظه (بایت) آیا اشاره گر میتونه از حافظه های موجود در بالای حافظه (که بیشتر از 4 بایت برای ذخیره شدن نیاز دارند) استفاده کنه؟
دقیقا نمیدونم چینش و وضعیت استفاده از حافظه توسط سیستم عامل چطوری هست. ولی در حالت کلی سیستم عامل تصمیم میگیره به شما حافظه ای رو اختصاص بده یا نه.
ولی فک کنم میشه امتحان کرد(تا بحال بهش فک نکرده بودم/ شایدم نشه:31:). حالا امتحان کنید به این شکل که ادرس که مورد نطرتون هست و حساب کنید بعد به اشاره کر اختصاص بدید بعد باهاش کار کنید که ببنید جواب میده یا نه.
فقط 1 نکته ای هست. اونم اینه که سیستم عامل شما تا چقدر حافظه پشتیبانی میکنه. مثلا سیتم عامل 32 بیتی به نطرم تا 4gb رم ساپورت میکنه.
پس از ساعت های فراوان فعلا به یه نتیجه رسیدم که اشاره گر رشته ای Read-Only هست. و قابل تغییر دادن نیست. و این ربط به Stack و ... داره که من فعلا نمیدونم چی هست.
بیشتر فهمیدم تاپیک به روز میشه. هر کی بره بفهمه بیاد به زبون فارسی لری، توضیح بده، ثوابی به این هوا خواهد برد.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
آقایون من هر چی جلوتر میرم بیشتر غرق میشم.
همه جا بحث اینه که مرجع یک شی جدید نیست و حافظه اضافه از سیستم نمیگیره. یه نام دیگس براش. یه Alias برای اون متغیر هست.
اما چه طوری؟
این یه توضیح تو تاپیک زیر. کسی میتونه با شکل بفهمونه (براش پودر میشم.)
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]کد:A pointer has its own memory address and size on the stack (4 bytes on x86), whereas a reference shares the same memory address but also takes up some space on the stack. Since a reference has the same address as the original variable itself, it is safe to think of a reference as another name for the same variable. Note: What a pointer points to can be on the stack or heap. Ditto a reference. My claim in this statement is not that a pointer must point to the stack. A pointer is just a variable that holds a memory address. This variable is on the stack. Since a reference has its own space on the stack, and since the address is the same as the variable it references. More on stack vs heap. This implies that there is a real address of a reference that the compiler will not tell you.