PDA

View Full Version : سوال در مورداشاره گرها و رشته



Salah Sanjabian
شنبه 25 دی 1389, 17:41 عصر
سلام خدمت دوستان.





میخواستم ببینم چطور این خط(خط دوم)کد کل رشته رو چاپ میکنه؟



char *N="Sali";

cout<<endl<<N;

cout<<endl<<*N





حقیقتش من این سوال واسه این واسم پیش اومد که اگه متغیر اشاره گری مثله این داشته باشیم(خط سوم)



Int Number=10;

Int *Point=&Number

Cout<<Point
cout<<endl<<N;//


آدرس متغیرروچاپ میکنه وبرادسترسی غیرمستقیم باید از *Pointer استفاده کنیم ،درحالی که برا یه متغیر اشاره گر از * اسفاده نمیکنیم و اگر هم استفاده کنیم به حرف اول اشاره و فقط S رو چاپ میکنه

mehdi.mousavi
شنبه 25 دی 1389, 19:23 عصر
سلام.
این کد رو در نظر بگیرید:


char *p = "TEST";با این تعریف و در Runtime، متغیر p به آدرسی از حافظه اشاره میکنه که اون string در اون قرار گرفته. دقیق تر بخوام بگم، به اولین خونه حافظه ای که TEST در اون قرار گرفته. فرض کنیم اون آدرس این باشه: 0x00417830 (این عدد هیچ معنای خاصی نداره و فقط برای مثال ذکرش کردم). از طرف دیگه، میدونیم که یک رشته در حافظه خونه های متوالی حافظه رو به خودش اختصاص میده. همینطور، چون متغیر char هستش، پس میدونیم هر کاراکتر از اون رشته یک بایت فضا میخواد. با این توضیحات، بفرمایید p + 1 یعنی چی؟ (لطفا قبل از اینکه ادامه مطلب رو بخونید، قدری فکر کنید و سعی کنید به سوالم پاسخ بدید).

بسیار خوب، p + 1 یعنی آدرسی که p به اون اشاره میکرد رو یک بایت جلو ببر و چون رشته از نوع char تعریف شده بود، پس p + 1 یعنی آدرس جایی که حرف E در اون ذخیره شده (حرف دوم در رشته TEST). پس خروجی کد زیر چی هستش؟


char *p = "TEST";
cout << (p + 1);هوووممم... اگر گفتید حرف E، اشتباه کرده اید. cout، یک رشته رو از شروع رشته تا وقتی به 0 یا NULL برسه، چاپ میکنه. گفتیم p + 1 جایی رو نشون میده که حرف E در اون قرار داره، پس کد فوق، EST رو روی صفحه نشون میده... و یه سوال دیگه... آدرسی که p + 1 داره به اون اشاره میکنه کجاست؟ طبیعتا 0x00417831... حالا با این تفاسیر، به من بگید خروجی کد زیر چی هستش؟


char *p = "TEST";
cout << *(p + 1);خوب.... اینجا چه اتفاقی میفته؟ p + 1 که گفتیم میشه آدرسی که حرف E در اون قرار گرفته (یعنی 0x00417831). وقتی یه * پشتش میاریم، یعنی میخواهیم محتوای اون آدرس رو ببینیم. محتوای آدرسی که p + 1 به اون اشاره میکنه چیه؟ درسته، حرف E. بنابراین خروجی کد فوق حرف E هستش. در واقع، Code Block فوق با Code Block زیر تفاوتی نداره:


char *p = "TEST";
cout << p[1];اینجا هم p خودش، داره به آدرس 0x00417830 اشاره میکنه، بنابراین، کد فوق، نشون میده که اندیس دوم (چون Zero-Based هستش) از رشته فوق مد نظر ما بوده، در نتیجه، p[1] و *(p + 1( تفاوتی با هم ندارن. حالا به من بگید خروجی کد زیر چی هستش؟


char *p = "TEST";
cout << &*p;خوب، اینجا ابتدا *p رو باید ببینیم چی میشه. *p یعنی همون p[0] یعنی محتوای اولین خونه در رشته فوق که میشه T. سپس & رو روی اون اعمال میکنیم. & چی رو داره نشون میده؟ نشون میده ما آدرس خونه مزبور رو میخواهیم، که چیه؟ 0x00417830. پس خروجی کد فوق چیه؟ (دقت کنید اینبار به دام نیفتید)... بدین ترتیب باید بتونید خروجی کد زیر رو نیز تشخیص بدید:


char *p = "TEST";
cout << &*(p + 2);خوب. حالا اجازه بدید یه قدم جلوتر بریم. به نظر شما خروجی کد زیر چیه؟


char *p = "TEST";
cout << (int)&*(p + 2);
باز از سمت راست، p + 2 یعنی چی؟
حالا *(p + 2) چی میشه؟
حالا یه & هم بهش Apply کنید، چی رو نشون میده؟
حالا به integer تبدیلش کنید و بصورت ده دهی نشونش بدید....

کد فوق، آدرس خونه ای که S در اون قرار گرفته رو روی صفحه نشون میده (یعنی عدد ؟ .... 0x00417830 + 2 (البته به در مبنای ده)).

اگر مطالبی که گفتم رو متوجه شده باشید، باید بتونید خروجی کد زیر رو نیز تشخیص بدید:


char *p = "TEST";
cout << *&*(p + 1);حالا اینقدر با & و * بازی کنید، تا احساس راحتی با اونها داشته باشید.

موفق باشید.

Salah Sanjabian
شنبه 25 دی 1389, 23:06 عصر
سلام.
این کد رو در نظر بگیرید:


char *p = "TEST";با این تعریف و در Runtime، متغیر p به آدرسی از حافظه اشاره میکنه که اون string در اون قرار گرفته. دقیق تر بخوام بگم، به اولین خونه حافظه ای که TEST در اون قرار گرفته.


char *p = "TEST";

cout، یک رشته رو از شروع رشته تا وقتی به 0 یا NULL برسه، چاپ میکنه.
.
ممنون ازتوضیحات جامع و کاملتون. فکر کنم مشکل من تا اینجارفع شده باشه.
مخصوصا توضیحاتتون در مورد cout

char *String="Sali\0as";

جواب سوال آخرتون هم فکر کنم E باشه
سوالی که ذهنمو مشغول کرده اینه که حافظه ای که اختصاص داده میشه آیاحافظه Ram هست یاحافظه مجازی؟
بعضی وقتا خطا در زمان اجرای Access Vioaltion رو داریم. آیا این خطامربوط به جایی که OS دراونجالود شده؟