اطلاعیه

Collapse
No announcement yet.

اشاره گر ها

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    اشاره گر ها

    سلام دوستان،
    من شنیدم که برای نوشتن در حافظه در زبان سی میشه از اشاره گر استفاده کرد.
    فرض کنید من میخوام تو آدرس 0x1000 از رم مقدار 0x12FF رو بنویسم. باید چی کار کنم؟
    باید از malloc هم استفاده کنم؟ چطوری؟

    #2
    پاسخ : اشاره گر ها

    نوشته اصلی توسط plasma
    سلام دوستان،
    من شنیدم که برای نوشتن در حافظه در زبان سی میشه از اشاره گر استفاده کرد.
    فرض کنید من میخوام تو آدرس 0x1000 از رم مقدار 0x12FF رو بنویسم. باید چی کار کنم؟
    باید از malloc هم استفاده کنم؟ چطوری؟
    سلام
    کد برنامه شما این میشه
    کد:
    unsigned int * my_pointer;
    my_pointer=0x1000;
    *my_pointer =0x12FF;
    یا بطور ساده تر
    کد:
    *(unsigned int *)(0x1000)=0x12FF;
    * عملگر اشاره گر است.

    دیدگاه


      #3
      پاسخ : اشاره گر ها

      با سلام خدمت اساتید.
      ببخشید در عکس زیر اونجایی که فلش زدم دقیقا چه کاری انجام میده ؟

      خیلی ممنون از کمکتون.

      دیدگاه


        #4
        پاسخ : اشاره گر ها

        نوشته اصلی توسط saati.sms نمایش پست ها
        با سلام خدمت اساتید.
        ببخشید در عکس زیر اونجایی که فلش زدم دقیقا چه کاری انجام میده ؟

        خیلی ممنون از کمکتون.
        سلام
        به این کار Type casting میگن. با این کار به کامپایلر میفهمونید با array به عنوان اشاره گر به نوع int رفتار کنه.
        بودنش توی این کد خاص بی تاثیره و میشه حذفش کرد!

        دیدگاه


          #5
          پاسخ : اشاره گر ها

          نوشته اصلی توسط hossein.m98 نمایش پست ها
          سلام
          به این کار Type casting میگن. با این کار به کامپایلر میفهمونید با array به عنوان اشاره گر به نوع int رفتار کنه.
          بودنش توی این کد خاص بی تاثیره و میشه حذفش کرد!
          پس چرا توی شکل زیر خروجی اشتباه میشه ؟

          دیدگاه


            #6
            پاسخ : اشاره گر ها

            نوشته اصلی توسط saati.sms نمایش پست ها
            پس چرا توی شکل زیر خروجی اشتباه میشه ؟
            خوب این کد، کد قبلی نیست! دقت کنید هر int بسته به کامپایلر میتونه 2 یا 4 بایت طول داشته باشه. وقتی شما آدرس یک آرایه char که 1 بایته به پوینتر int میدید، اون به اندازه 2 یا 4 خونه از آرایه میخونه و فکر میکنه همه این 2 یا 4 بایت مربوط به یک متغیره. توی کد قبلی آرایه هم از نوع int بود که گفتم تایپ کستینگ در موردش بی تاثریه. اما اینجا قضیه فرق داره.

            دیدگاه


              #7
              پاسخ : اشاره گر ها

              نوشته اصلی توسط hossein.m98 نمایش پست ها
              خوب این کد، کد قبلی نیست! دقت کنید هر int بسته به کامپایلر میتونه 2 یا 4 بایت طول داشته باشه. وقتی شما آدرس یک آرایه char که 1 بایته به پوینتر int میدید، اون به اندازه 2 یا 4 خونه از آرایه میخونه و فکر میکنه همه این 2 یا 4 بایت مربوط به یک متغیره. توی کد قبلی آرایه هم از نوع int بود که گفتم تایپ کستینگ در موردش بی تاثریه. اما اینجا قضیه فرق داره.
              میشه این حالت دومی رو توضیح بدید .
              پس اینجوری تایپ کستینگ به چه دردی میخوره اگر قراره اشتباه بشه ؟

              دیدگاه


                #8
                پاسخ : اشاره گر ها

                نوشته اصلی توسط saati.sms نمایش پست ها
                میشه این حالت دومی رو توضیح بدید .
                پس اینجوری تایپ کستینگ به چه دردی میخوره اگر قراره اشتباه بشه ؟
                هر چیزی به جای خودش و درست اگر به کار بره، دارای خاصیته!
                ببینید شما فرض بگیرید که یک تابع 2 تا پارامتر ورودی داره که پارامتر اول، نوع پارامتر دوم رو مشخص میکنه. خوب میدونید توی زبان C نمیشه یک تابع چند نوع پروتوتایپ داشته باشه و ما میخواییم این کار حتما انجام بشه! راه حل استفاده از اشاره گر هستش. میاییم نوع پارامتر دوم رو از نوع اشاره گر به void قرار میدیم. به این صورت میشه آدرس هر نوع داده ای رو به تابع ارسال کرد.
                داخل بدنه تابع فرضا تشخیص دادیم که نوع پارامتر دوم چیه و به چه نوع داده ای داره اشاره میکنه. حالا باید چه کاری انجام بدیم که بتونیم از داده امون استفاده کنیم؟ باید آدرسی که داریم به پورینتری از نوع همون داده بدیم و در این کار از تایپ کستینگ استفاده میکنیم. به شکل زیر:
                کد:
                #define ParamTypeInt    0
                #define ParamTypeFloat    1
                void f(int paramType, void *param)
                {
                    if(paramType == ParamTypeInt)
                    {
                        int *paramInt = (int *) param;
                        printf("param = %d", *paramInt);
                    }
                    else if(paramType == ParamTypeFloat)
                    {
                        float *paramFloat = (float *) param;
                        printf("param = %f", *paramFloat);
                    }
                }

                دیدگاه


                  #9
                  پاسخ : اشاره گر ها

                  نوشته اصلی توسط hossein.m98 نمایش پست ها
                  هر چیزی به جای خودش و درست اگر به کار بره، دارای خاصیته!
                  ببینید شما فرض بگیرید که یک تابع 2 تا پارامتر ورودی داره که پارامتر اول، نوع پارامتر دوم رو مشخص میکنه. خوب میدونید توی زبان C نمیشه یک تابع چند نوع پروتوتایپ داشته باشه و ما میخواییم این کار حتما انجام بشه! راه حل استفاده از اشاره گر هستش. میاییم نوع پارامتر دوم رو از نوع اشاره گر به void قرار میدیم. به این صورت میشه آدرس هر نوع داده ای رو به تابع ارسال کرد.
                  داخل بدنه تابع فرضا تشخیص دادیم که نوع پارامتر دوم چیه و به چه نوع داده ای داره اشاره میکنه. حالا باید چه کاری انجام بدیم که بتونیم از داده امون استفاده کنیم؟ باید آدرسی که داریم به پورینتری از نوع همون داده بدیم و در این کار از تایپ کستینگ استفاده میکنیم. به شکل زیر:
                  کد:
                  #define ParamTypeInt    0
                  #define ParamTypeFloat    1
                  void f(int paramType, void *param)
                  {
                      if(paramType == ParamTypeInt)
                      {
                          int *paramInt = (int *) param;
                          printf("param = %d", *paramInt);
                      }
                      else if(paramType == ParamTypeFloat)
                      {
                          float *paramFloat = (float *) param;
                          printf("param = %f", *paramFloat);
                      }
                  }
                  ممنون بابت پاسختون.
                  الان در تصویر زیر من یک ارایه int تعریف کردم و سپس میخوام نوع اشاره گر اون رو به char تغییر بدم. با اینکه پوینتر p2array یک کاراکتر هست ، طول ان 4 بایت میباشد که یعنی تایپ کستینگ انجام نمیشه . مشکل کجاست.( مثال قبلی رو هم متوجه شدم. ممنون. )

                  دیدگاه


                    #10
                    پاسخ : اشاره گر ها

                    نوشته اصلی توسط saati.sms نمایش پست ها
                    ممنون بابت پاسختون.
                    الان در تصویر زیر من یک ارایه int تعریف کردم و سپس میخوام نوع اشاره گر اون رو به char تغییر بدم. با اینکه پوینتر p2array یک کاراکتر هست ، طول ان 4 بایت میباشد که یعنی تایپ کستینگ انجام نمیشه . مشکل کجاست.( مثال قبلی رو هم متوجه شدم. ممنون. )
                    طول آدرس همیشه ثابته و ربطی به نوع داده نداره.

                    دیدگاه

                    لطفا صبر کنید...
                    X