آژانس هواپیماییexchanging

اشاره گر ؟

شروع موضوع توسط Mehdi.T ‏15 مارس 2006 در انجمن خانواده C++ , C

  1. Mehdi.T

    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 هست چیه ؟
    تشکر
     
  2. Arash_j13

    Arash_j13 Registered User

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

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

    Mehdi.T کاربر فعال برنامه نویسی کاربر فعال

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

    Mehdi.T کاربر فعال برنامه نویسی کاربر فعال

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

    چه فرقی در این دو خروجی هست ؟
    کد:
    #include <stdio.h>
    
    void main() {
    	int *x;
       printf("%p\n%p",x,&x);
       getchar();
    }
    
    فکر کنم یکیشون فیزیکی یکیشون منطقی باه اما کدوم نمیدونم :(
     
  5. Arash_j13

    Arash_j13 Registered User

    تاریخ عضویت:
    ‏18 فوریه 2005
    نوشته ها:
    778
    تشکر شده:
    2
    محل سکونت:
    مشهد
    اول مکانی که x بهش اشاره می کنه رو چاپ می کنه بعد هم ادرس خود x رو
     
  6. Mehdi.T

    Mehdi.T کاربر فعال برنامه نویسی کاربر فعال

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

    Arash_j13 Registered User

    تاریخ عضویت:
    ‏18 فوریه 2005
    نوشته ها:
    778
    تشکر شده:
    2
    محل سکونت:
    مشهد
    ببید x به جایی اشاره می کنه ولی معلوم نیست کجاست متغییر ها در سی مقدار دهی اولیه صفر نمی شن
    اشاره گرها هم داخلش یه عدد هست که ادرس های حافظه رو مشخص می کنن خب حالا هر عددی که داخل x باشه x به اونجا اشاره می کنه برنامه نویس های با تجربه همیشه تاکید می کنن برای اینکه اشتباهی در برنامه نویسی به وجود نیاد اشاره گر های رو خودتون با NULL مقدار دهی اولیه بکنید و گره ممکنه حوادث عجیب غریبی پیش بیاد ممکنه اون اشاره گر به وسط کد برنامه اشاره کنه و با تغییرش برنامه ی شما به هم بخوره
     
  9. Mehdi.T

    Mehdi.T کاربر فعال برنامه نویسی کاربر فعال

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

    Arash_j13 Registered User

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

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

    Mehdi.T کاربر فعال برنامه نویسی کاربر فعال

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

    MNSY کاربر تازه وارد

    تاریخ عضویت:
    ‏21 مارس 2006
    نوشته ها:
    6
    تشکر شده:
    0
    محل سکونت:
    anywhere
    میشه یه کمکی به منم بکنید و بگید چه جوری میشه برای یه اشاره گر که می خوام به عنوان آرایه دو بعدی استفاده می کنم تخصیص حافظه کنم ؟
     
  13. Mehdi.T

    Mehdi.T کاربر فعال برنامه نویسی کاربر فعال

    تاریخ عضویت:
    ‏30 سپتامبر 2005
    نوشته ها:
    506
    تشکر شده:
    3
    محل سکونت:
    In Search of Sunrise
    این یک بعدی(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();
    }
    
    
    :)
     
  14. avajang.com .leftavajang.com.right
  15. MNSY

    MNSY کاربر تازه وارد

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

    بابت کمکی هم که کردید ممنون
     
  16. gooliof_iran

    gooliof_iran کاربر تازه وارد

    تاریخ عضویت:
    ‏19 ژانویه 2005
    نوشته ها:
    99
    تشکر شده:
    0
    ساده ترين و جالبترين برنامه براي نمايش كاربرد اشاره گرها در ++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

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

    merdadi کاربر تازه وارد

    تاریخ عضویت:
    ‏15 آپریل 2006
    نوشته ها:
    22
    تشکر شده:
    1
  18. merdadi

    merdadi کاربر تازه وارد

    تاریخ عضویت:
    ‏15 آپریل 2006
    نوشته ها:
    22
    تشکر شده:
    1
    درست اجرا ميشه - ولي ايرادي كه گفتي نفهميدم ؟؟؟؟؟؟؟؟؟:blush:
     
  19. Arash_j13

    Arash_j13 Registered User

    تاریخ عضویت:
    ‏18 فوریه 2005
    نوشته ها:
    778
    تشکر شده:
    2
    محل سکونت:
    مشهد
    کار بسیار خطر ناکی می کنه این برنامه چون نباید بدون تخصیص حافظه از اشاره گر استفاده کرد
    این بعد از اینکه ادرس یک واحد بهش اضافه می شه معلوم نیست به کجا اشاره می کنه اگه این اضافه کردن ادامه پیدا کنه ممکنه برنامه اسیب ببینیه و اشاره گر وارد سگمنت کد بشه
    بهرته سعی کنید اینجوری برنامه نویسی نکنید
     
  20. merdadi

    merdadi کاربر تازه وارد

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