PDA

View Full Version : سوال: فرق این سه اشاره گر در چیست؟



motherboard
چهارشنبه 05 شهریور 1393, 13:41 عصر
سلام.می خواستم بدونم فرق این سه اشاره گر در چیست؟
int*x;
int*x=0;
int*x=10;

می خواستم در رابطه با سه کد بالا در یک خط برام نحوه عملکرد این اشاره گرها رو برام توضیح بدید.

rahnema1
چهارشنبه 05 شهریور 1393, 13:49 عصر
آخرش به جواب سوال قبلی رسیدین یا کلا تاپیک را ولش کردین؟

motherboard
چهارشنبه 05 شهریور 1393, 14:01 عصر
آخرش به جواب سوال قبلی رسیدین یا کلا تاپیک را ولش کردین؟
جواب سوال قبلی رو گرفتم.و متوجه ماجرا شدم.اما در اخر اون تاپیک یک سوالی رو کردم که چرا وقتی داریم از this استفاده می کنیم.فقط به شی Box1 اشاره می کنه. و اصلا کاری با شی Box2 نداره ؟؟؟ نکته مبهم ماجرا همین هست.و واقعا این رو نفهمیدم و من منتظر پاسخ شما و دوستان دیگر هستم و اون تاپیک همچنان در جریان هست.و همچنین منتظر پاسخ شما و دوستان دیگر در رابطه با این تاپیک هم هستم.از بابت سوالات زیادی که می کنم واقعا عذر می خوام.

rahnema1
چهارشنبه 05 شهریور 1393, 14:50 عصر
بر فرض اینکه اینها کد ++c هست
در مورد اول یک اشاره گر به int تعریف می کنیم ولی این اشاره گر به یک جای منطقی حافظه اشاره نمی کنه
در مورد دوم و سوم شما یک عدد صحیح را به صورت ضمنی می خواهید به اشاره گر تبدیل کنید. در کل این کار ممنوع هست مگر درمورد صفر که این کار اجازه داده شده که در واقع صفر میشه null pointer constant و تبدیل این ثابت عددی به اشاره گر اجازه داده شده
اما برای سایر ارقام برای تبدیل شدن به اشاره گر لازمه تبدیل صریح یا cast صورت بگیره

int * a=(int*)10;

motherboard
چهارشنبه 05 شهریور 1393, 15:47 عصر
ممنون.همون طور که فرمودید اشاره گر کد اول به جای خاصی اشاره نمیکند.حالا در کد دوم که مقدار صفر رو قرار دادیم ایا اشاره ای صورت می گیرد.منظورم اینه که ایا در کد دوم که مقدار صفر رو قرار دادیم ایا یک حافظه ای تخصیص داده میشه که در اون حافظه مقدار 0 قرار دارد و ادرس اون حافظه در متغیر اشاره گر قرار دارد؟؟؟

rahnema1
چهارشنبه 05 شهریور 1393, 16:50 عصر
هر پروسه برای خودش یک حافظه داره که این حافظه حافظه مجازیه از طریق سیستم عامل این حافظه به حافظه فیزیکی تبدیل میشه ولی اگه این آدرس منطقی نباشه و بخواهیم مقدار موجود در این آدرس را مورد استفاده قرار دهیم باعث میشه سیستم عامل پیغام خطا بفرسته و برنامه بسته بشه.
در سیستم عامل ها به طور پیش فرض اینجور تنظیم شده که صفر ، به جایی از آدرس فیزیکی اشاره نکنه
به عبارت دیگه null pointer یک آدرس منطقی نیست

motherboard
چهارشنبه 05 شهریور 1393, 17:02 عصر
هر پروسه برای خودش یک حافظه داره که این حافظه حافظه مجازیه از طریق سیستم عامل این حافظه به حافظه فیزیکی تبدیل میشه ولی اگه این آدرس منطقی نباشه و بخواهیم مقدار موجود در این آدرس را مورد استفاده قرار دهیم باعث میشه سیستم عامل پیغام خطا بفرسته و برنامه بسته بشه.
در سیستم عامل ها به طور پیش فرض اینجور تنظیم شده که صفر ، به جایی از آدرس فیزیکی اشاره نکنه
به عبارت دیگه null pointer یک آدرس منطقی نیست
من کاملا متوجه صحبتاتون میشم.اما مگر ادرس منطقی یک ادرس مجازی نیست؟ و اگر هست چه طور null pointer یک ادرس منطقی نیست؟مرسی.

مسعود اقدسی فام
چهارشنبه 05 شهریور 1393, 17:42 عصر
ممنون.همون طور که فرمودید اشاره گر کد اول به جای خاصی اشاره نمیکند.حالا در کد دوم که مقدار صفر رو قرار دادیم ایا اشاره ای صورت می گیرد.منظورم اینه که ایا در کد دوم که مقدار صفر رو قرار دادیم ایا یک حافظه ای تخصیص داده میشه که در اون حافظه مقدار 0 قرار دارد و ادرس اون حافظه در متغیر اشاره گر قرار دارد؟؟؟

نه اینطور نیست. x متغیری از نوع اشاره‌گر هست. پس اگه مقداردهی بشه یه آدرس داخلش قرار می‌گیره. شما اون کد رو اینطور در نظر بگیرید:


int *x;
x=0;


صفر قرار دادن اشاره‌گر همون NULL کردن هست که یعنی به جایی اشاره نمی‌کنه.
این کد با کد قبلی فرق داره:



int *x;
*x = 0;


اینجا گفته شده که محتوای محلی رو که x به اون اشاره می‌کنه برابر صفر قرار بده. این قسمت از کد حتما اجرا نمی‌شه. چون اشاره‌گر x به جایی اشاره نمی‌کنه که بخواد مقدار اون محل از حافظه رو هم برابر صفر قرار بده.
این کد هم:



int *x = 0;
*x = 0;



مشکل کد قبلی رو داره. اینجا هم به صراحت اعلام شده که x به صفر یا به NULL‌ اشاره می‌کنه که معادل اشاره نکردن به محل خاصی هست.
در کل مقدار دادن به یه اشاره‌گر به صورت مستقیم به معنی گرفتن حافظه نیست. برای تخصیص حافظه از new یا malloc استفاده می‌شه.

int *x = new int;
*x = 0;
delete x;


این کد حافظه‌ی جدیدی برای یه متعیر int اختصاص و آدرسش رو در x قرار می‌ده. بعد محتوای اون محل رو صفر قرار می‌ده و در نهایت حافظه‌ی تخصیصی رو با delete آزاد می‌کنه. این کد و تخصیص مقدار صفر به محل اشاره شده‌ با x بدون خطا و درست کار می‌کنه.

اگه این برنامه رو اجرا کنید:

#include<iostream>
using namespace std;
int main()
{
int *x = new int;
*x = 0;
cout << "address:" << x << endl;
cout << "value:" << *x << endl;
delete x;
return 0;
}


ممکنه هر اجرای برنامه، سطر اول متفاوتی رو نمایش بده که آدرس اختصاصی به متغیر رو نشون می‌ده. اما سطر دوم همیشه صفر هستش.

rahnema1
چهارشنبه 05 شهریور 1393, 17:50 عصر
من کاملا متوجه صحبتاتون میشم.اما مگر ادرس منطقی یک ادرس مجازی نیست؟ و اگر هست چه طور null pointer یک ادرس منطقی نیست؟مرسی.

منظورم اینه که اگه بخواهیم از محتوای حافظه با آدرس صفر استفاده کنیم خطا ایجاد میشه. چرا؟
بالاخره حافظه مجازی که در دست برنامه ماست باید یک معادل در روی حافظه فیزیکی داشته باشه یا نه؟ چون صفر به یک حافظه فیزیکی مرتبط نمیشه ( سیستم عامل به طور پیشفرض تنظیم شده که این کار را نکنه)
توی این برنامه می خواهیم محتوای آدرس صفر را چاپ کنیم که برنامه در حین اجرا دچار مشکل می شه

int * a=0;
cout << *a;

omid_kma
چهارشنبه 05 شهریور 1393, 21:42 عصر
int * a=(int*)10;

این کد کار می کنه ولی باید دقت داشته باشید که اگر a رو derefrence کنید( یعنی *a) این اون چیزی نیست که احتمالا فکر می کنید و *a ده نیست
*a میشه محتویات خانه ده از حافظه که احتمالا خارج از محدوده آدرس برنامه هست و سیستم عامل برنامه رو میبنده .