اطلاعیه

Collapse
No announcement yet.

چرا اشاره گر ؟

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

    چرا اشاره گر ؟

    سلام به همه اساتید
    آقا یه سوال دارم اگه بتونید جواب بدید واقعا خدمت بزرگی بهم کردید

    ببینید من با زبان c برنامه مینویسم (در سطح آماتوری) و کتاب جعفر نژادو خوندم و یه سری پی دی افو ......
    راستشو بخاید سوالم در مورد اشاره گر هاست . خودم بلدم از شون استفاده کنم و کلیتشو میدونم چیه ولی اینکه چرا ازش استفاده میشه رو نمیدونم
    یعنی فکر میکنم کاری رو که با اشاره گر میشه انجام داد بدون اشاره گرم میشه انجامش داد .درسته یا غلط ؟ اگه درسته پس چرا اصلا اشاره گر درست شده و انقدر ازشون استفاده میشه و اگه غلطه چرا؟اگه بتونید تو غالب یه مثال کوچیک جواب بدید خیلی :wow: :wow: :wow: میشم

    اگه متوجه سوالم نشدید بگید یه جور دیگه بپرسم
    *****برای آدمی بهتر است که اصلا به دنیا نیاید تا اینکه بیایدو هیچ تاثیری نگذارد *****
    ناپلئون بناپارت

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

    تقریبا خیلی از کارایی که با اشاره گر میشه انجام داد رو با آرایه هم میشه انجام داد، ولی برا کامپایلر کامپایل کردن اشاره گره ساده تر از آرایه هست و کد بهینه تری رو تولید میکنه و به همین دلیل کامپایلر ها هم معمولا ابتدای کامپایل تمام آرایه هارو به اشاره گر تبدیل میکنن
    به جز این، یه کارایی رو تو سی یا سی پلاس پلاس فقط میشه با اشاره گر انجام داد، مثلا: اگه بخوای از یه تابع چند تا خروجی رو با هم برگردونی!
    در کل اگر به استفاده از اشاره گر عادت کنی اونموقع هم حجم کدت پایین تر میاد و هم کد سریع تر و بهینه تری داری.
    ;()((void (*)(void))0x0000))

    دیدگاه


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

      ممنون
      خوب مثلا در رابطه با همین که میگید چنتا خروجی
      آیا نمیشه مثلا چنتا متغیر عمومی تعریف کردو مقادیر دلخواه رو بریزیم توش و تو توابع دیگه ازش استفاده کرد؟

      یا مثلا چرا توابع رو با ارجاع فراخوانی میکنن ؟ مگه نمیشه همین طوری معمولی فراخوانی کرد؟ چه فرقی بینشون هست؟ :question:
      *****برای آدمی بهتر است که اصلا به دنیا نیاید تا اینکه بیایدو هیچ تاثیری نگذارد *****
      ناپلئون بناپارت

      دیدگاه


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

        ببین دوست عزیز، به فرض کدهایی که شما نوشتی در حد 2000 خط به بالا نبوده. من خودم بیشتر از 10000 خط کد C ننوشتم تا حالا... فرض کن الآن سال 1990 هست و یه پروژه نرم افزاری بزرگ مثل نسخه اولیه ویندوز در حال توسعه ست. صدها برنامه نویس در حال کار کردن روی این پروژه هستند. به نظر شما معقوله که همه متغیرها رو به صورت عمومی توی فایل هدر globals.h تعریف کنیم و بدیم دستِ همه برنامه نویس ها؟!
        مسلماً الآنه روش های برنامه نویسی شیءگرا خیلی از این مشکلات رو حذف کرده. ولی بازم خواناییِ کد خیلی مهمه. توسعه پذیری و مقیاس پذیریِ کد مهمه. همیشه که کد نویسی برای میکروکنترلرِ AVR نیست که دوست عزیز.
        برای همین، استفاده از توابع می تونه بسیار موثر باشه.
        یکی از مشکلات زبان C همینه که بیشتر از یه دونه خروجی نمی تونه ایجاد کنه. اگه بخوایم 2 تا خروجی توی تابع داشته باشیم بیچاره می شیم. یا باید struct درست کنیم، یا به صورت اشاره گر بدیمش توی آرگومان ورودی.
        البتــــــه، یکی از محاسنِ بزرگ زبان C استفاده از اشاره گرها و تبدیل نوعِ اشاره گرهاست. مثلاً من یه بسته داده از پورت سریال دارم که یه سری بایت پشتِ سر هم توش هست. انواع داده های مختلف هم داره از کاراکتر و عدد صحیح و float و آرایه و غیره همه چیز توش هست. من الآن همه این ها رو به صورت یه رشته بایتی پشتِ سر هم دارم و می خوام محتواش رو استخراج کنم. نگاه کن:
        [code=C]
        data_struct UpdateFrame(unsigned char * Data)
        {
        float * p_float;
        unsigned short * p_uint16;
        unsigned char * p_uint8;
        data_struct out_str;

        p_float = (float *) &Data[0];
        out_str.azT = *p_float++;
        out_str.elT = *p_float++;
        out_str.rt = *p_float++;
        out_str.Vt = *p_float++;
        out_str.az = *p_float++;
        out_str.el = *p_float++;
        out_str.lt = *p_float++;
        out_str.h = *p_float++;
        out_str.ep = *p_float++;
        out_str.bt = *p_float++;

        p_uint16 = (unsigned short *) p_float;
        out_str.wx = *p_uint16++;
        out_str.wy = *p_uint16++;
        out_str.dx = *p_uint16++;
        out_str.dy = *p_uint16++;

        p_float = (float *) p_uint16;
        out_str.P1 = *p_float++;
        out_str.P2 = *p_float++;
        out_str.Dl_x = *p_float++;

        p_uint8 = (unsigned char *) p_float;
        out_str.cntr = *p_uint8++;

        out_str.mode = *p_uint8++;
        out_str.com = *p_uint8++;

        return out_str;
        }[/code]

        توی این کد از تغییر نوع اشاره گر ها استفاده خوبی شده.

        موفق باشید
        بیایید با Google آشتی کنیم!

        دیدگاه


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

          گرفتم دم شما گرم
          *****برای آدمی بهتر است که اصلا به دنیا نیاید تا اینکه بیایدو هیچ تاثیری نگذارد *****
          ناپلئون بناپارت

          دیدگاه


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

            مهم ترین یا شاید اصلی ترین دلیل وجود اشاره گر دسترسی به حافظه است ،
            همین ویزگی هست که زبان c تبدیل به قوی ترین زبان برنامه نویسی برای میکروکنترلر ها و ... میکنه
            اگر هدر فایل های هر نوع میکروکنترلر یا حتی SOC ها رو نگاه کنید مشاهده خواهید کرد که به چه شکل برای دسترسی به فضای memory map یا همون ناحیه IO از اشاره گر ها استفاده شده است

            ------------------------------
            توصیه دوستانه اگر میخواهید با c برای میکروکنترلر کد بنویسد سعی کنید مبحث اشاره گر ها رو به صورت کاربردی خوب درک کنید

            دیدگاه


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

              نوشته اصلی توسط محمد رستمی
              ببین دوست عزیز، به فرض کدهایی که شما نوشتی در حد 2000 خط به بالا نبوده. من خودم بیشتر از 10000 خط کد C ننوشتم تا حالا... فرض کن الآن سال 1990 هست و یه پروژه نرم افزاری بزرگ مثل نسخه اولیه ویندوز در حال توسعه ست. صدها برنامه نویس در حال کار کردن روی این پروژه هستند. به نظر شما معقوله که همه متغیرها رو به صورت عمومی توی فایل هدر globals.h تعریف کنیم و بدیم دستِ همه برنامه نویس ها؟!
              مسلماً الآنه روش های برنامه نویسی شیءگرا خیلی از این مشکلات رو حذف کرده. ولی بازم خواناییِ کد خیلی مهمه. توسعه پذیری و مقیاس پذیریِ کد مهمه. همیشه که کد نویسی برای میکروکنترلرِ AVR نیست که دوست عزیز.
              برای همین، استفاده از توابع می تونه بسیار موثر باشه.
              یکی از مشکلات زبان C همینه که بیشتر از یه دونه خروجی نمی تونه ایجاد کنه. اگه بخوایم 2 تا خروجی توی تابع داشته باشیم بیچاره می شیم. یا باید struct درست کنیم، یا به صورت اشاره گر بدیمش توی آرگومان ورودی.
              البتــــــه، یکی از محاسنِ بزرگ زبان C استفاده از اشاره گرها و تبدیل نوعِ اشاره گرهاست. مثلاً من یه بسته داده از پورت سریال دارم که یه سری بایت پشتِ سر هم توش هست. انواع داده های مختلف هم داره از کاراکتر و عدد صحیح و float و آرایه و غیره همه چیز توش هست. من الآن همه این ها رو به صورت یه رشته بایتی پشتِ سر هم دارم و می خوام محتواش رو استخراج کنم. نگاه کن:
              [code=C]
              data_struct UpdateFrame(unsigned char * Data)
              {
              float * p_float;
              unsigned short * p_uint16;
              unsigned char * p_uint8;
              data_struct out_str;

              p_float = (float *) &Data[0];
              out_str.azT = *p_float++;
              out_str.elT = *p_float++;
              out_str.rt = *p_float++;
              out_str.Vt = *p_float++;
              out_str.az = *p_float++;
              out_str.el = *p_float++;
              out_str.lt = *p_float++;
              out_str.h = *p_float++;
              out_str.ep = *p_float++;
              out_str.bt = *p_float++;

              p_uint16 = (unsigned short *) p_float;
              out_str.wx = *p_uint16++;
              out_str.wy = *p_uint16++;
              out_str.dx = *p_uint16++;
              out_str.dy = *p_uint16++;

              p_float = (float *) p_uint16;
              out_str.P1 = *p_float++;
              out_str.P2 = *p_float++;
              out_str.Dl_x = *p_float++;

              p_uint8 = (unsigned char *) p_float;
              out_str.cntr = *p_uint8++;

              out_str.mode = *p_uint8++;
              out_str.com = *p_uint8++;

              return out_str;
              }[/code]

              توی این کد از تغییر نوع اشاره گر ها استفاده خوبی شده.

              موفق باشید
              خیلی ممنون از مطلبی که گفتید،اگر ممکن هست یک توضیحی در مورد کدی که بهش اشاره کردید بدید لطفا

              ضمنا اگر منبع خوبی برای این سبک برنامه نویسی با C&C++ میشناسید معرفی کنید، متاسفانه من هرچی مطلب مورد برنامه نویسی پیدا میکنم ، ابتدایی و تکراریه

              دیدگاه


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

                یک متغیر یک یا دو یا حداکثر 4-5 بایت از حافظه رو مشخص میکنه . ولی یک اشاره گر محل شروع یک قسمت از حافظه رو مشخص میکنه .
                حالا ببین اینها میتونن جای هم استفاده بشن ؟ حالا در حقیقت آرایه ها و رشته ها و کلاس ها و استراکچر ها یک اشاره گر های کنترل شده هستند.

                معمولا توصیه میشه با اشاره گر ها کار نکنید. علتش نوع تخریب آمیز بودن کار برد اشاره گر هاست. یک متغیر یک حوزه دید داره . یعنی دیگه حداکثر حوزه یک متغیر میتونه سراسری پابلیک باشه . که فقط به متحویات داخل اون پروسس میتونه دست رسی داشته باشه . ولی اشاره گر ها عین یک لودر میتونه مدیرت حافظه سیستم عامل رو با خاک یکسان کنه.
                تنها موردی که همه آدما یقین دارن خدا در حقش زیاد لطف کرده
                داشتن عقله زیادتر از دیگر آدم ها است

                دیدگاه


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

                  نوشته اصلی توسط محمد رستمی
                  البتــــــه، یکی از محاسنِ بزرگ زبان C استفاده از اشاره گرها و تبدیل نوعِ اشاره گرهاست. مثلاً من یه بسته داده از پورت سریال دارم که یه سری بایت پشتِ سر هم توش هست. انواع داده های مختلف هم داره از کاراکتر و عدد صحیح و float و آرایه و غیره همه چیز توش هست. من الآن همه این ها رو به صورت یه رشته بایتی پشتِ سر هم دارم و می خوام محتواش رو استخراج کنم. نگاه کن:
                  [code=C]
                  data_struct UpdateFrame(unsigned char * Data)
                  {
                  float * p_float;
                  unsigned short * p_uint16;
                  unsigned char * p_uint8;
                  data_struct out_str;

                  p_float = (float *) &Data[0];
                  out_str.azT = *p_float++;
                  out_str.elT = *p_float++;
                  out_str.rt = *p_float++;
                  out_str.Vt = *p_float++;
                  out_str.az = *p_float++;
                  out_str.el = *p_float++;
                  out_str.lt = *p_float++;
                  out_str.h = *p_float++;
                  out_str.ep = *p_float++;
                  out_str.bt = *p_float++;

                  p_uint16 = (unsigned short *) p_float;
                  out_str.wx = *p_uint16++;
                  out_str.wy = *p_uint16++;
                  out_str.dx = *p_uint16++;
                  out_str.dy = *p_uint16++;

                  p_float = (float *) p_uint16;
                  out_str.P1 = *p_float++;
                  out_str.P2 = *p_float++;
                  out_str.Dl_x = *p_float++;

                  p_uint8 = (unsigned char *) p_float;
                  out_str.cntr = *p_uint8++;

                  out_str.mode = *p_uint8++;
                  out_str.com = *p_uint8++;

                  return out_str;
                  }[/code]

                  توی این کد از تغییر نوع اشاره گر ها استفاده خوبی شده.

                  موفق باشید
                  سلام
                  میشه یکم ساده تر درمورد تبدیل نوع اشاره گرها توضیح بدین و اینکه کاربردش چیه
                  ممنون
                  در کشور های غربی انتقال تجربیات و دانش به افراد مبتدی یک پیشرفت محسوب شده و به آن مدیریت دانش می گویند. ولی متاسفانه این فرهنگ هنوز در کشور ایران رایج نشده است !!!

                  دیدگاه


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

                    نوشته اصلی توسط sejil
                    سلام
                    میشه یکم ساده تر درمورد تبدیل نوع اشاره گرها توضیح بدین و اینکه کاربردش چیه
                    ممنون
                    شرمنده م. نمی شه...
                    بیایید با Google آشتی کنیم!

                    دیدگاه


                      #11
                      پاسخ : چرا اشاره گر ؟

                      نوشته اصلی توسط محمد رستمی
                      شرمنده م. نمی شه...
                      چرا؟
                      در کشور های غربی انتقال تجربیات و دانش به افراد مبتدی یک پیشرفت محسوب شده و به آن مدیریت دانش می گویند. ولی متاسفانه این فرهنگ هنوز در کشور ایران رایج نشده است !!!

                      دیدگاه


                        #12
                        پاسخ : چرا اشاره گر ؟

                        نوشته اصلی توسط محمد رستمی

                        البتــــــه، یکی از محاسنِ بزرگ زبان C استفاده از اشاره گرها و تبدیل نوعِ اشاره گرهاست. مثلاً من یه بسته داده از پورت سریال دارم که یه سری بایت پشتِ سر هم توش هست. انواع داده های مختلف هم داره از کاراکتر و عدد صحیح و float و آرایه و غیره همه چیز توش هست. من الآن همه این ها رو به صورت یه رشته بایتی پشتِ سر هم دارم و می خوام محتواش رو استخراج کنم. نگاه کن:
                        [code=C]
                        data_struct UpdateFrame(unsigned char * Data)
                        {
                        float * p_float;
                        unsigned short * p_uint16;
                        unsigned char * p_uint8;
                        data_struct out_str;

                        p_float = (float *) &Data[0];
                        out_str.azT = *p_float++;
                        out_str.elT = *p_float++;
                        out_str.rt = *p_float++;
                        out_str.Vt = *p_float++;
                        out_str.az = *p_float++;
                        out_str.el = *p_float++;
                        out_str.lt = *p_float++;
                        out_str.h = *p_float++;
                        out_str.ep = *p_float++;
                        out_str.bt = *p_float++;

                        p_uint16 = (unsigned short *) p_float;
                        out_str.wx = *p_uint16++;
                        out_str.wy = *p_uint16++;
                        out_str.dx = *p_uint16++;
                        out_str.dy = *p_uint16++;

                        p_float = (float *) p_uint16;
                        out_str.P1 = *p_float++;
                        out_str.P2 = *p_float++;
                        out_str.Dl_x = *p_float++;

                        p_uint8 = (unsigned char *) p_float;
                        out_str.cntr = *p_uint8++;

                        out_str.mode = *p_uint8++;
                        out_str.com = *p_uint8++;

                        return out_str;
                        }[/code]

                        توی این کد از تغییر نوع اشاره گر ها استفاده خوبی شده.

                        موفق باشید
                        تو کد بالا از قبل از کد فوق یک استراکچر out_str تعریف شده و بعد یک استراکچر دیگه UpdateFrame تعریف شده که رشته ورودی رو تکه تکه میکنید دوباره در out_str قرار میده .اشاره گر فلوت 8 بایتی زیاد میشه و اشاره گر unsigned short فکر کنم دو بایتی زیاد میشه و اشاره گر unsigned char یک بایتی زیاد میشه

                        تو مرحله یک آدرس رشته تو اشاره گر فلوت قرار میگیره و 8 تا 8 تا رشته رو جدا میکنه و ...

                        استراکچر نوع ابتدایی و اولیه کلاس است . این هار رو میشه تو بیسیک و پاسکال و ... هم تعریف کرد اونجا دیگه لازم نیست علامت اشاره گر گذاشت

                        نوشته اصلی توسط aliila
                        در حقیقت آرایه ها و رشته ها و کلاس ها و استراکچر ها یک اشاره گر های کنترل شده هستند.
                        تنها موردی که همه آدما یقین دارن خدا در حقش زیاد لطف کرده
                        داشتن عقله زیادتر از دیگر آدم ها است

                        دیدگاه


                          #13
                          پاسخ : چرا اشاره گر ؟

                          نوشته اصلی توسط sejil
                          چرا؟
                          چرا نداره چون سخته(-؛
                          البته ساده تر بیان کردنش سخته
                          در مجموع اگر پروژتون سبکه و پیچیدگی زیادی نداره میتونین از اشاره گرها صرف نظر کنین اما ...
                          مطمئن باشین اگر پروژتون پیچیده بشه غیر ممکنه شما از اشاره گر استفاده نکنین دلایلش :
                          گاهی اوقات نیازه با توجه به مقدار یک متغیری بر روی چندین متغیر دیگه پردازش هایی انجام بشه و باتوجه به وضعیت جدید اون متغیرها کارهای دیگه ای صورت بگیره
                          خوب اگر قرار باشه عملیاتی که میخوایم بر روی اون چندین متغیر صورت بگیره توسط یه تابع باشه و اون تابع هم توی یک فایل دیگه باشه و از همه مهمتر متغیری که قراره با توجه به مقدار اون بقیه متغیرها روشون پردازش بشه یک متغیر عمومی نباشه تقریبا (تجه بشه تقریبا) شما راهی ساده تر از استفاده از اشاره گر ها ندارین
                          اونکه یکی از دوستان گفتن اشاره گرها مثل لودر میمونه درسته اما قسمت تخریبش اشتباهه! اگر شما کار با اشاره گرهارو بلد باشین میتونین پروژه های سنگین رو کنترلر کنین و در غیر اینصورت شاید یه پروژه بزرگ رو به اتمام برسونین اما پروژتون یکبار مصرفه یعنی در آینده حتی حدود یک ماه بعد ممکنه نتونین داخل پروژه تغییر خاصی بوجود بیارین
                          من بیشتر برای میکروها برنامه مینویسم و توصیه میکنم حتما اشاره گرهارو یاد بگیرین چون یه ابزار خیلی قدرتمنده و شاید بشه گفت بدون اشاره گرها زبان C فرق ناچیزی با Basic داره
                          برای اطلاعات بیشتر از مزایای اشاره گرها حتما به کتابهای مختلف آموزش زبان c رجوع کنین

                          جوابت رو بخاطر عکس عالی آواتارت دادم
                          ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                          شهید دکتر مصطفی چمران
                          اللهم صل علی محمد و ال محمد و عجل فرجهم
                          ; C is not for children

                          دیدگاه


                            #14
                            پاسخ : چرا اشاره گر ؟

                            نوشته اصلی توسط مهدی رهی
                            جوابت رو بخاطر عکس عالی آواتارت دادم
                            سلام
                            ان شاالله که فرج ولی معصوم ما ، آقا امام زمان هرچه زودتر به وقوع بپیونده .
                            ممنون از پاسخت مهدی جان. اشاره گرها رو فهمیدم ، اما خب تبدیل در نوع اشاره گر برام جا نیفتاده یا بهتره بگم اصلا متوجه نمیشم.
                            یاعلی مدد
                            در کشور های غربی انتقال تجربیات و دانش به افراد مبتدی یک پیشرفت محسوب شده و به آن مدیریت دانش می گویند. ولی متاسفانه این فرهنگ هنوز در کشور ایران رایج نشده است !!!

                            دیدگاه


                              #15
                              پاسخ : چرا اشاره گر ؟



                              اضافه شده در تاریخ :
                              نوشته اصلی توسط sejil
                              سلام
                              ان شاالله که فرج ولی معصوم ما ، آقا امام زمان هرچه زودتر به وقوع بپیونده .
                              ممنون از پاسخت مهدی جان. اشاره گرها رو فهمیدم ، اما خب تبدیل در نوع اشاره گر برام جا نیفتاده یا بهتره بگم اصلا متوجه نمیشم.
                              یاعلی مدد
                              سلام
                              ان شاء الله

                              دوست عزیز جواب این سوال خیلی مفصله بهتره به کتابهای آموزش زبان c مراجعه کنی
                              حتما از چند کتاب استفاده کن
                              ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                              شهید دکتر مصطفی چمران
                              اللهم صل علی محمد و ال محمد و عجل فرجهم
                              ; C is not for children

                              دیدگاه

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