• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

اشاره گر ؟

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
سوالم رو این طوری مطرح کنم بهتره اول به دو برنامه نگاهی بندازید + خروجی

کد:
#include <stdio.h>

void main() {
	int *p,*x,m=5 ;
   x = &m;
   //p = x ;
   printf("%p",p);
   getchar();
}
خروجی p = 00001(که البته از کامپیوتری به کامپیوتر دیگه ممکنه فرق کنه)
کد:
#include <stdio.h>

void main() {
	int *p,*x,m=5 ;
   x = &m;
   p = x ;
   printf("%p",p);
   getchar();
}
اینجا خروجی آدرس x هست
حالا سوال اینه اون مقدار اولیه p که در کام. من 1 هست چیه ؟
تشکر
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
خروجی p در مثال اول همون طور که گفتید از سیستمی به سیتم دیگه و حتی ممکنه روی یک سیستم در زمان های و شرایط مختلف فرق کنه این متغییر مقدار دهی اولیه نشده و سی هم هیچ متغییری رو مقدار دهی اولیه نمی کنه پس هر مقداری در فضایی از حافظه که برای p در نظر گرفته شده بود الان چاپ می شه

در مورد دومی هم آدرس x رو چاپ نمی کنه بلکه متویات x که ادرس m هست رو چاپ می کنه
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
درست اما اشاره گر نمیتونه مقداری بگیره ،(فکر کنم مقدار p در مثال اول آدرس منطقی p در حافظه باشه که اگر اشتباه نکنم windows از مدل segments ها استفاده می کنه و در نهایت ادرس منطقی + مقدار پایه شده و آدرس فیزیکی رو درست میکنه )
اما در جواب دومتون باز اگر بیاییم به این خروجی نگاه کنیم فکر کنم p به آدرس m اشاره می کنه
کد:
    printf("%p\n%p",p,&m);

در نهایت خروجی یکی هست
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
حالا اگر اجازه بدبد یه سوال دیگه که پیشاپیش از همکاریتون تشکر میکنم

چه فرقی در این دو خروجی هست ؟
کد:
#include <stdio.h>

void main() {
	int *x;
   printf("%p\n%p",x,&x);
   getchar();
}
فکر کنم یکیشون فیزیکی یکیشون منطقی باه اما کدوم نمیدونم :(
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
اول مکانی که x بهش اشاره می کنه رو چاپ می کنه بعد هم ادرس خود x رو
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
نه آرش جان ، چون x به جایی اشاره نمیکنه !
فکر کنم اولیه فیزیکی باشه دومیه منطقی(آدرس)
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
ببید x به جایی اشاره می کنه ولی معلوم نیست کجاست متغییر ها در سی مقدار دهی اولیه صفر نمی شن
اشاره گرها هم داخلش یه عدد هست که ادرس های حافظه رو مشخص می کنن خب حالا هر عددی که داخل x باشه x به اونجا اشاره می کنه برنامه نویس های با تجربه همیشه تاکید می کنن برای اینکه اشتباهی در برنامه نویسی به وجود نیاد اشاره گر های رو خودتون با NULL مقدار دهی اولیه بکنید و گره ممکنه حوادث عجیب غریبی پیش بیاد ممکنه اون اشاره گر به وسط کد برنامه اشاره کنه و با تغییرش برنامه ی شما به هم بخوره
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
نمیدونم !
اما تا جایی که یادمه متغییر مقدار اولیه نمیگیره جز رشته
اما ما در حافظه دو جور آدرس داریم
منطقی (توسط CPU )و فیزیکی آدرس نهایی که برنامه نویس از آن برای قطعه های حافظه استفاده می کنه که شما وقتی برنامتون رو اجرا می کنید برنامه شما یک پایه میگیرد و متغییر های شما یک حد و هرگاه بخواهید از حافظه استفاده کنید آدرس منطقی شما + پایه شده و آدرس فیزیکی رو تشکیل میده(در سیستم هایی که از قطعه بندی استفاده میکنن) من فکر می کنم شاید یکی این آدرس ها از همین بحث پیروی کنن و در حال دیگه میتونیم اینو بگیم :
مقدار x در خروجی باید offset خود x در حافظه باشه و دومی جایی که بطور پیش فرض اشاره می شه
اما در نهایت باز هم جای تحقیق داره که من این عمل رو مفید میدونم(برای دوستان اهل زبان میانی)
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
البته رشته ها هم مقدار اولیه نمی گیرن چون چیزی به اسم رشته نداریم رشته ها آرایه ای از کارکتر ها هستن که خود ارایه ها هم اشاره گرن پس رسته ها اشاره گری به کارکتر ها هستن و نه اسشاره گرها و نه کارکتر ها مقدار اولیه پیش فرض می گیرن

در مورد توضیحاتتون هم فکر نمی کنم با گفته ها من تناقضی داشته باشه
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
آرش جان من به این نتیجه از خود C رسیدم :
مقدار اولی که چاپ می شه آدرس حافظه
مقدار دومی Machine Stack(البته من خودم از این آخریه زیاد سر در نمیارم)
//برای صحت حرف هام میشه هنگام اجرا به CPU مراجعه کرد
 

MNSY

کاربر تازه وارد
تاریخ عضویت
21 مارس 2006
نوشته‌ها
6
لایک‌ها
0
محل سکونت
anywhere
میشه یه کمکی به منم بکنید و بگید چه جوری میشه برای یه اشاره گر که می خوام به عنوان آرایه دو بعدی استفاده می کنم تخصیص حافظه کنم ؟
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
به نقل از MNSY :
میشه یه کمکی به منم بکنید و بگید چه جوری میشه برای یه اشاره گر که می خوام به عنوان آرایه دو بعدی استفاده می کنم تخصیص حافظه کنم ؟

این یک بعدی(10)
کد:
#include <stdio.h>
#include <stdlib.h>

void main() {
	int *p ;
   p = (int *) malloc( sizeof(int) * 10 ) ;
   getchar();
}

و این دو بعدی(10*10)
کد:
#include <stdio.h>
#include <stdlib.h>

void main() {
	int **p ;
   int i ;
   p = (int **) malloc(sizeof(int) * 10) ;
   for(i=1;i<=10;i++ )
   	p[i] = (int *) malloc(sizeof(int) * 10) ;
   getchar();
}

:)
 

MNSY

کاربر تازه وارد
تاریخ عضویت
21 مارس 2006
نوشته‌ها
6
لایک‌ها
0
محل سکونت
anywhere
شما به بزرگی خودتون به بخشید:happy:

بابت کمکی هم که کردید ممنون
 

gooliof_iran

کاربر تازه وارد
تاریخ عضویت
19 ژانویه 2005
نوشته‌ها
99
لایک‌ها
1
ساده ترين و جالبترين برنامه براي نمايش كاربرد اشاره گرها در ++C
ساده ترين برنامه كه كاربرد اشاره گر ها در(++C) را نشان ميدهد. اين برنامه چگونگي علامتگذاري حافظه را به بهترين نحو نمايش مي دهد.
با كمترين متغير مي توان تا زماني كه حافظه آزاد وجود دارد بدون تعريف متغير از آن استفاده نمود. البته آدرس اشاره گرها نيز در هر مرحله نمايش داده مي شود.
ممكن است درمحيط DOS و محيط WINDOWS خروجيهاي آدرس حافظه يكسان نباشد. علت هم اندازه تعريف شده براي هر كلمه مي باشد. مثلا 8 بيتي ، 16 بيتي ، 32 بيتي و يا 64 بيتي.
البته برنامه هاي ++C قابل حمل مي باشند. همانطور كه در بالا اشاره شد فقط آدرس حافظه ممكن است متفاوت از نظر طول باشد.

براي اينكه فضاي زيادي اشغال نكنه من فقط لينكش رو مي زارم.
اگه سوالي بود در خدمتم:

http://bitasoft.topcities.com/all_folders/fa_pages/c_prg_samples/Pointers_application_in_c++.htm

البته يك ايراد هم در اين برنامه وجود دارد.
اجرا مي شود و حافه هم مي گيرد.
ولي تا كي ؟
اين مطلب رو فردا بررسي خواهيم كرد.
 

merdadi

کاربر تازه وارد
تاریخ عضویت
15 آپریل 2006
نوشته‌ها
22
لایک‌ها
2
درست اجرا ميشه - ولي ايرادي كه گفتي نفهميدم ؟؟؟؟؟؟؟؟؟:blush:
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
کار بسیار خطر ناکی می کنه این برنامه چون نباید بدون تخصیص حافظه از اشاره گر استفاده کرد
این بعد از اینکه ادرس یک واحد بهش اضافه می شه معلوم نیست به کجا اشاره می کنه اگه این اضافه کردن ادامه پیدا کنه ممکنه برنامه اسیب ببینیه و اشاره گر وارد سگمنت کد بشه
بهرته سعی کنید اینجوری برنامه نویسی نکنید
 

merdadi

کاربر تازه وارد
تاریخ عضویت
15 آپریل 2006
نوشته‌ها
22
لایک‌ها
2
آفرين - دقيقا همينه
در ابتدا بايد با استفاده از دستور malloc يك مقدار فضا به اندازه كافي از حافظه آزاد گرفت.
بعد مقدار در اون ريخت.
:blush:
مي خواستم با اين مثال همين نكته رو نشون بدم.
دفعه بعدي برنامه تكميل شده رو مي زارم.
:p
 
بالا