نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ
مهدی دمیرچیلو

آموزش جامع اشاره گرها در Pointer Tutorial in C

204

به نام خدا : تو این مطلب از سری مطالب آموزش های متفرقه ++C/C میخوام به بحث اشاره گرها در زبان C بپردازم، و این که اشاره گر چی هستش و کاربردش چیه و… رو میخوام بگم، البته این که میگم “میگم” laugh منظورم اینه: کتابها و لینک های مفید رو میزارم و یه سرفصلی در مطلب تهیه کردم و گفتم که اینو از این فایل بخونید و این یکی رو از اون فایل و اون یکی! رو از اون سایت و… و اگه چیزی موند اونو خودم میگم، و البته مثال هایی برای فهم بیشتر موضوع هم ذکر میکنم(چون تو این سری فایل ها و مطلب به نظرم مثال کم ذکر شده، هر چند که بحث ساده ولی مهم هستش)، همون طور که گفتم این سری مطالب رو برا بحث نوشتن کتابخانه میکرو و برنامه نویسی های پیشرفته!!! میگم و خواهم گفت(البته اگه زنده باشیم sarcastic )، و به درد تازه کارا نمیخوره، یه دفه طرف تازه کاره میاد این مطلب رو میخونه و فک میکنه برا یاد گرفتن میکرو باید اینا رو در ابتدا یاد بگیره، اینا رو که یاد نمیگیره که هیچ، از میکرو هم زده میشه، کسی که میخواد میکرو یاد بگیره تازه، بره فصل اول و دوم هر کتاب آموزش زبان C رو بخونه براش کفایت میکنه و این مطالب به دردش نمیخوره(البته فعلا :-D)؛ از این حرفا بگذریم بریم سراغ اصل مطلب(یاد این فیلم ها افتادم که طرف تو عروسی میگه : دیگه بریم سر اصل مطلب laugh ) ، راستی کمربندا رو سفت ببندید چون مقابل یکی از طولانی طرین مطالب این سایت قرار دارید laugh (کم کم بخونید، اگه میبینید خسته میشید، کم کم بخونید ولی تمومش کنید چون دهنم سر نوشتن این مطلب چیز شد، چیزم که میدونی یعنی چی ^_^)
آموزش جامع اشاره گرها در Pointer Tutorial in C

آموزش جامع اشاره گرها در Pointer Tutorial in C


داستان : خب یه داستان بگم اول مطلب laugh ، تو خونمون مرغ لاری دارم من^_^، نمیدونم چی شد این مرغه از خونه رفت بیرون(در باز بود، بابام بردش بیرون و…) بابام اومد مرغه رو بگیره، یه صدایی داد که نگو، بعد همسابمون خروس لاری داره pardon آقا هیچی، جان داش خروسا تا صدای این داد این مرغه رو شنیدن شروع کردن به جیغ و داد کردن O_o (همون غد غد غودا rofl)، وسط ظهر، مگه ول میکردن، جان داش ول کن، کوتاه بیاید، قول میدم که دفه آخر باشه، هیچی دیگه ما وسط نماز بودیم، دیگه خودتون حال ما رو تصور کنید. laugh ///// در مطلب زیر اون صورتی رنگ ها نیاز به تکمیل شدن دارند

منابع مطالعه درباره اشاره گر

  1. آموزش اینتراکتیو ++C(فصل هفتم)
  2. آموزش اشاره گر ها در برنامه نویسی
  3. اشاره‌گرها در زبان ++C
  4. اشاره گرها
  5. یه ۴ تا فایل(۳ تا PDF و ۱ دونه پاورپوینت، این فایل ها شماره بندی شدن، مثلا تو مطلب میگم فایل PDF شماره ۱ رو بخونید، که باید بیاید سراغ این فایل دانلود و فایل PDF شماره ۱ اش رو بخونید، این فایل ها مطالب خوبی هستن، حتما دانلود کنید، اینا منتخب آموزش هایی هستن که من از نت گرفتم)
  6. کتاب دایتل اند دایتل(دانلود از لینک مقابل) >>> فصل۸: دانلود کتاب آموزش برنامه نویسی به زبان سی پلاس پلاس
  7. کتاب دکتر احمد فراهانی(لینک دانلود در زیر گزاشتم) >>> فصل۵ و فصل۷

 

دانلود ۴تا فایل آموزش اشاره گرها (۳ تا PDF و ۱ دونه پاورپوینت)

دانلود کتاب برنامه سازی پیشرفته نوشته دکتر احمد فراهانی

1) اشاره گر( آموزش اشاره گر )

۱) اشاره گر

در این قسمت عناوین زیر بحث میشه :

  1. اشاره گر جیست
  2. کاربرد اشاره گر
  3. نحوه تعریف اشاره گر
  4. نحوه مقدار دهی اشاره گرها
  5. انواع اشاره گر از نظر نوع داده(int, float, doube, array, void)
  6. عملگرهای & و *

اینو میرید تو فایل ها و لینک های بالا میخونید و یاد میگیرد.(چون مطلبو از آخر به اول نوشتم، الان حال این قسمتا رو ندارم که کاملش کنم و ارجاع میدم همش، چند روز نفس گیر پای این مطلب هستم آخه)
مثال۱ -جمع بندی - عملگر های & و *
مثال زیر رو ببینید بد نیست(البته یه جورایی خلاصه بحث ابتدایی اشاره گر هستش، البته! باید قبلش منابعی رو که گفتم رو خونده باشید، بازم البته!!! اگه یکم رو کد زیر فک کنید بدون مطالعه متوجه میشید، و البته این البته ها چقدر زیاد شد laugh )

2) محاسبات اشاره گرها

۲) محاسبات اشاره گرها

در این قسمت موضوعات زیر بحث میشه :

  1. انتساب اشاره گر ها به همدیگه.
  2. تغییر مقدار اشاره گرها
  3. مقایسه اشاره گرها
  4. تغییر آدرس اشاره گرها

این عناوینی که در بالا گفتم رو در تموم منابع بالا میخونید و یاد میگیرید، همون اول مباحث اینا مطرح شدن.

3) اشاره گر void

۳) اشاره گر void

توضیح نمیدم، منابعی که در زیر معرفی میکنم رو بخونید :

  1. صفحه ۲۷۷ از فصل ۸ از کتاب دیتل اند دیتل
  2. صفحه ۸ و ۹ اون فایل PDF شماره ۱(بالای مطلب برا دانلود گزاشتمش)
  3. دیدن لینک مقابل : اشاره گر از نوع void
4) مشکلات اشاره گرها

۴) مشکلات اشاره گرها

اشاره گرهایی هنوز مقدار دهی نشده اند و به جایی اشاره نمی‌کنند می‌توانند برای برنامه خطرناک باشند. به مثال زیر توجه کنید:

اشاره گر x هنوز مقدار دهی نشده(آدرس بهش ندادیم) و به یک خانه تصادفی اشاره میکند.
بنابراین دستور دوم سعی می‌کند عدد ۱۲ را در یک جای تصادفی از حافظه قرار دهد.
اگر خوش شانش باشید، این خانه به جایی در خارج از محدوده آدرس دهی برنامه اشاره می‌کند.
چون در این صورت سیستم‌عامل اجازه دسترسی به آن خانه را نداده و پیغام segmentation fault تولید می‌کند.
اما اگر بد شانس باشید و آن خانه در محدوده آدرس دهی برنامه باشد، محتوای یکی از ساختمان داده برنامه خود را بازنویسی کرده‌اید و اطلاعات آسیب خواهند دید.
منبع : اشاره‌گر(علوم رایانه)

5) انواع حالات اشاره گر و متغییر

۵) انواع حالات اشاره گر و متغییر

عنوان بهتر از این پیدا نکردم  blush، این قسمت رو کامل توضیح میدم، لذا لازم نیست منابع دیگه در این زمینه رو مطالعه کنید.(اونجایی که لازم باشه خودم موردی بهتون میگم.)

  1. اشاره گر و متغییر
  2. اشاره گر ثابت و متغییر
  3. اشاره گر و متغییر ثابت
  4. اشاره گر ثابت و متغییر ثابت

در زیر با یه مثال توضیح میدم.(همون طور که میبینید کد زیر چیزیو نمایش نمیده و فقط برا اینه که ببینید کدوم حالت صحیح و کدوم حالت اشتباه هستش که اونایی که اشتباه هستش رو اومدم به صورت توضیحات درش ابردم.)

در کد بالا دو تا متغییر تعریف کردم(خط ۶ و ۷)، یکی متغییر معمولی(هم آدرس و هم مقدارش رو میشه تغییر داد، خط ۶) و یه متغییر ثابت(مقدارش رو نمیشه تغییر داد ولی آدرسش رو میشه تغییر داد، خط ۷)

توجه : وقتی یه متغییر رو از نوع ثابت تعریف میکنیم، مقدارش رو نمیتونیم تغییر بدیم ولی آدرسش رو میتونیم، حالا اگه آدرس این متغییر رو بدیم به یه اشاره گر ثابت، ادرس متغییر رو هم نمیتونیم تغییر بدیم، چون این آدرس متغییر میشه مقدار اشاره گر ثابت، و مقدار اشاره گر ثابت رو هم نمیشه تغییر داد(همانند متغییر ثابت که نمیشه مقدارش رو تغییر داد)، ولی در این حالت آدرس اشاره گر ر ومیتونیم تغییر بدیم، مگه این که آدرس این اشاره گر رو بدیم به یه "اشاره گری بر اشاره گر از نوع ثابت" که در این حالت آدرس اشاره گرمون رو هم نمیتونیم تغییر بدیم.....بگذریم از این حرفا.(در تمامی حالات زیر آدرس اشاره گر رو میشه تغییر داد، لذا اینو در تمامی حالات ذکر نمیکنم دیگه)

اشاره گر و متغییر
در خط ۱۰ یه اشاره گر معمولی تعریف کردم(مقدارش رو میشه تغییر داد) و آدرس یه متغییر معمولی رو بهش دادم.
توجه : ما وقتی آدرس یه متغییر رو میریزیم داخل یه اشاره گر، آدرس این متغییر میشه مقدار اشاره گر ما، حالا وقتی میگم مقدار اشاره گر رو میتونیم تغییر بدیم یعنی آدرس اون متغییر رو میتونیم تغییر بدیم.
حالا ما به کمک اشاره گر هم میتونیم مقدار متغییر رو تغییر بدیم(خط ۱۱) و هم آدرس متغییر(یا همون مقدار اشاره گر) رو خط ۱۲
کاربرد :

اشاره گر ثابت و متغییر
در خط ۱۴ یه اشاره گر ثابت تعریف کردم.(مقدار اشاره گر یا همون آدرس اون متغییر رو نمیتونیم تغییر بدیم)
توجه : مقدار اشاره گر های ثابت رو نمیتونیم تغییر بدیم، همانند متغییر های ثابت که نمیتونیم مقدارشون رو تغییر بدیم.
در این حالت میتونیم مقدار متغیر رو تغییر بدیم(خط ۱۵) چون متغییر از نوع ثابت نیستش که نتونیم مقدارش رو تغییر بدیم، ولی آدرس متغییر یا همون مقدار اشاره گر رو نمیتونیم تغییر بدیم(چون اشاره گرمون ثابت هستش، خط ۱۶)
کاربرد : اگه به آرایه ها دقت کرده باشید نام آرایه، یه اشاره گر ثابت هستش، که آدرسش رو نمیتونید تغییر بدیم اما مقدارش رو میتونیم بخونیم ||| نام آرایه، آدرس خونه اول آرایه هستش، همون طور که در خط ۷ مثال زیر میبینید انواع روش نمایش آدرس خونه اول آرایه رو نشون دادم، و در خط ۸ هم همون طور که میبینید به نام آرایه یه اشاره گر هستش که به خونه اول آرایه اشاره میکنه.

اشاره گر و متغییر ثابت
در خط ۱۸ میایم یه اشاره گر تعریف میکنیم و آدرس یه متغییر ثابت رو بهش میدیم؛ نکته ای که هستش اینه که در تعریف اشاره گر اومدیم از کلمه const استفاده کردیم، ولی اشاره گر از نوع ثابت نیستش، و فقط چون داریم ادرس یه متغییر ثابت رو به یه اشاره گر میدیم اومدیم و این کلمه کلیدی(const) رو در این مکان(قبل از *int) قرار دادیم(و اگه قرار ندیم برنامه خطا میگیره)
خلاصه : اگه const قبل از *int بود یعنی میخوایم آدرس یه متغییر ثابت رو به اشاره گر بدیم(همانند خط ۱۸)، و اگه const بعد از *int بود یعنی اشاره گرمون ثابت هستش(همانند خط ۱۴) و اگه در هر دو جا بود(همانند خط ۲۲) یعنی اشاره گر ثابتی داریم که آدرس یه متغییر ثابت رو میخوایم بهش بدیم
در این حالت چون متغییرمون ثابت هستش، نمیتونیم مقدارش رو تغییر بدیم(خط ۱۹)، ولی میتونیم آدرس متغییر یا همون مقدار اشاره گر رو تغییر بدیم(چون اشاره گرمون از نوع ثابت نیستش، خط ۲۰)
کاربرد : 

اشاره گر ثابت و متغییر ثابت
در خط ۲۲ اومدم یه اشاره گر ثابت تعریف کردیم و آدرس یه متغییر ثابت رو هم بهش دادم.
در این حالت چون متغییر از نوع ثابت هستش نمیتونیم مقدارش رو تغییر بدیم(خط ۲۳)، و چون اشاره گر از نوع ثابت هستش، لذا مقدار اشاره گر یا همون آدرس متغییر رو هم نمیشه تغییر داد(خط ۲۴)
کاربرد :

6) اشاره‌گری به اشاره‌گر دیگر

۶) اشاره‌گری به اشاره‌گر دیگر

کاربرد این مبحث : اشاره‌گر به اشاره‌گر کاربردهای مهمی مانند تعریف آرایه‌های پویای دو بعدی دارد.(به نقل از algorithmha)
منابع مطالعاتی : اون ۵ تا موردی که اول مطلب معرفی کردم.
مثال۱

شکل زیر جواب کد بالا هستش.
آموزش AVR به زبان C
توجه۱ : این اشاره گر ها متغییر هایی هستن که به جای مقدار آدرس داخلشون قرار میگیره، مثلا متغییر a داخلش اعداد صحیح قرار میگیره، و یه آدرسی هم داره، اشاره گرها هم همین طور، یه آدرسی دارن و یه مقدار که داخلشون ذخیره میشه، لذا این دو آدرس با هم برابر نیستند.(اینو گفتم تا یه وقت قاطی نکنید.)
توجه۲ : اینو هم بگم تا قاطی نکید، & کارش اینه که آدرس یه چیزو بهمون میده و * مقدار اون چیز رو بهمون میده.
این مثال اگه متوجه نشدید بگید تا توضیح بدم.

7) اشاره گر به تابع ( اشاره به تابع )

۷) اشاره گر به تابع ( اشاره به تابع )

برا این موضوع(حتما) بخش ۱۳-۷ از فقط ۷ کتاب فراهانی رو بخونید.(برای مطالعه بیشتر میتونید بخش ۱۲-۸ از فصل ۸ کتاب دیتل اند دیتل رو بخونید). فقط من مثال این کتاب رو اینجا قرار بدم و خودم دست بکار شم و یه توضیح کوچولو بدم دربارش و این نحوه تعریف "اشاره گر به تابع" رو هم بیشتر توضیح بدم.
توجه۱ : نام یه تابع، همانند نام آرایه یه اشاره گر ثابت هستش.(به یه آدرس ثابت از حافظه اشاره میکنه که این آدرس قابل تغییر نیست)
نحوه تعریف اشاره گر به تابع : چیزی که جلب توجه میکنه نحوه تعریف "اشاره گر به تابع" هستش(خط ۸) که در زیر توضیح میدم.
یه تابعی به نام function تعریف کردیم که دو پارامتر از نوع float و int دریافت میکنه و یه متغییر از نوع double بر میگردونه(با دستور return که همتون میدونید اینو)
تو خط ۴ تابع رو اعلان کردیم و تو خط ۱۴ به بعد تعریفش کردیم(اگه بخوایم تابعی رو بعد از تابع main تعریف کنیم، باید قبل از تابع main، اعلان اون تابع رو قرار بدیم، فرم استاندارد تعریف تابع به همین صورت هستش و شما هم سعی کنید از همین روش استفاده کنید، از ما گفتن بود)
تو خط ۸ یه "اشاره گر به تابع" تعریف کردیم که اسمش pf هستش، و همون طور که میبینید نوع تعریفش با بقیه اشاره گر ها فرق داره، چون قراره به یه تابع اشاره کنه به این صورت نوشتیمش، خب تو این تعریف اومدیم و پارامتر های تابعمون رو بعد از (pf*) قرار دادیم، و نوع ارسالی تابع رو هم مشخص کردیم که اومدیم و یه double قبل از (pf*) قرار دادیم.(لذا اون اشاره گری که به یه تابع اشاره میکنه، در تعریفش باید پرامتر های تابع رو بعد از اسم اشاره گر و نوع متغییر ارسالی تابع رو هم قبل از نام اشاره گر قرار بدیم............امیدوارم گیج نشده باشین، خودم که گیج شدم :-D)
حالا بعد از اعلان و تعریف تابع و تعریف "اشاره گر به تابع" باس آدرس تابع رو بدیم به این "اشاره گر به تابع" که تعریفش کردیم.(این کار در خط ۹ انجام شده shock >>> sarcastic )

کاربرد : یکی از کابرداش رو در ۲ مثال زیر میبینید.

مثال ۱----------------------------
تعریف یه "اشاره گر به تابع" که آدرس یه تابع رو ذخیره میکنه.

مثال ۲----------------------------
تعریف یه "اشاره گر به تابع" به صورت آرایه که آدرس چندین تابع رو ذخیره میکنه.
این مثال خیلی جالبه، ببینید چطور آدرس توابع رو در یه آرایه ذخیره میکنیم و بعد کاربر عددی بین ۰ تا ۲ وارد میکند و بر طبق اون تابع مورد نظر اجرا میشه، عدد ۰ وارد بشه، تابع۰ اجرا میشه، عدد۱ تابع۱، و عدد ۲ تابع۲ رو اجرا میکنه(توضیحات بیشتر داخل کد های مثال زیر)

8) اشاره گر و رشته( مجموعه ای از کاراکترها)

۸) اشاره گر و رشته ( مجموعه ای از کاراکترها )

جایی ندیدم در این مورد درست حسابی توضیح داده باشه، غیر از کتاب "دیتل اند دیتل" که در بخش ۱۳-۸ فصل ۸ یه توضیحاتی داده.
البته چیز خاصی هم نداره در کل، ولی یه سری ریزه کاری داره که اگه ندونید در همه جا حسابی اضیتتون میکنه، مثلا این که در پایان هر رشته، یه کاراکتری برای پایان دادن به اون رشته وجود داره، مثلا تو بحث دریافت دیتا توسط میکرو(از کامپیوتر) و یا برعکس، این موضوع که پایان هر رشته ای یه کاراکتر پایانی هستش دونستنش مهمه.(مثلا الان اهمیت موضوع رو فهمیدین ^_^)
خب بهتره با یه مثال توضیح بدم :

جواب مثال بالا به صورت زیر هستش
 Pointer Tutorial in C
خطوط ۱۰-۷ : همون طور که میبینید به ۴ روش یه رشته ای رو تعریف کردیم، که غیر از روش ۴ ام(خط ۱۰) که مختص زبان ++C هستش، از ۳ روش دیگه میتونید در زبان C استفاده کنید.
برای استفاده از اون روش ۴ ام(خط ۱۰) باید از کتابخونه string استفاده کنید که در خط ۲ فراخونی کردم این کتابخونه رو.
(تا جایی که من میدونم) خط ۷ و ۸ پروژه کدهاش یکسان هستش، فقط فرقش اینه که تو خط ۷ اومدیم کاراکتر ها رو یه جا دادیم به آرایه و تو خط ۸ حرف حرف دادیم.(حالا از دوستان اگه کسی اطلاعات بیشتری در این زمینه داره بگه)
همنون طور که قبلا گفتم نام آرایه یه اشاره گر ثابت هستش که آدرس خونه اول رو در خودش ذخیره میکنه؛ در این جا نام آرایه برابر با آدرس حرف اول رشته ما هستش(خط ۷ و ۸)
همین طور که میبینید در زبان C رشته ها به کمک آرایه ها تعریف میشوند و البته روش دیگه ای هستش و اونم استفاده از اشاره گر ها هستش که الان توضیح میدم.
خب برای این که همانند کد های خط ۷ و ۸ بخوایم یه رشته تعریف کنیم باید یه اشاره گر ثابت تعریف کنیم(چون نام آرایه یه اشاره گر ثابت هستش) و بعد مقدار رو به این اشاره گر میدیم(خط ۹) که این اشاره گر(همانند آرایه ها) به حرف اول رشته مورد نظر اشاره میکنه(آدرس حرف اول رشته ما رو در خودش ذخیره میکنه)
خب همون طور که میدونید هر کاراکتری یه کد ASCII داره، در پایان رشته ها، یه کاراکتری هستش به نام کاراکتر پایانی، که رشته رو خاتمه میده و مقدار کد ASCII ایش ۰ هستش که در خطوط ۱۸ تا ۲۱ خواستم بهتون نشون بدم که پایان تموم رشته ها(در هر ۴ روش) یه کاراکتری هستش برای پایان دادن به رشته(که ما به کمک این کاراکتر میفهمیم که رشتموم تموم شده است.) >>> حالا حتما میپرسید چه لزومی داره که این کاراکتر باشه >>> باید بگم که : از اشاره گر مثال میزنم چون میدونم الان ذهنیت خوبی دارید نسبت بهش و بهتر متوجه میشید، مثلا فک کنید ما رشتمون رو با اشاره گر تعریف کردیم(خط ۹) و میخوایم مقدار رشته رو نشون بدیم(خط ۱۲)، حالا اگه این کاراکتر پایانی در ته این رشته نباشه برنامه از کجا بدونه که ته این رشته کجا هستش؟ میاد کد اسکی کل حافظه رو نمایش میده :-D(البته اشاره گر ها مثلا بود و در ۳ روش دیگه هم به همین صورت هستش)
اگه کد ASCII رو نمیدونید چیه مطلب مقابل رو بخویند : اسکی (ASCII) چیست؟
اون خط ۱۶ هم برا این گزاشتم که ببینید کد اسکی کاراکتر a برابر ۹۷ هستش، اول خود کاراکتر a رو نشون میدم و بعد کد اسکیش رو، در لینکی که در بالا گزاشتم هم میتونید مقایسه کنید که آیا کد اسکی حاراکتر a به درستی نمایش داده شده یا نه.^_^

سوال : چرا آرایه های خط ۷ و ۸ دارای ۴ تا کاراکتر هستن ولی شما مقدار ۵ رو به آرایه دادین(که یعنی آرایه ۵ تا خونه داره)؟؟؟
جواب : فک کنم در بالا دربارش توضیح دادم، ولی بازم میگم، خب آخر هر رشته ای(و هر آرایه ای) یه کاراکتری پایانی هستش که کد اسکیش ۰ هستش و این کاراکتر رو به صورت '۰\' نشون میدن، که میتونی این کد پایانی رو قرار بدی یا قرار ندی، اگه قرار ندی، برنامه خودش به صورت خودکار این کاراکتر رو در نظر میگیره در پایان رشته.
در مثال زیر هر دو تعریف با هم برابر هستند :

حالا ممکنه براوتون سوال بشه که چطور میشه کاراکتر پایانی رو در اون سه تعریف(تعریف رشته) دیگه چطور میشه تعیین کرد : باید بگم که نمیدونم و میپرسم و اگه فهمیدم به شما میگم و اگه شما میدونید یا فهمیدید هم به ما بگید.(عمرا کسی مرام این جور کارا رو داشته باشه)

مقدار دهی رشته های تعریف شده به کمک اشاره گر ها

خب برای این موضوع، مثال زیر کفیت میکنه، یه توضیحکی! هم بعد از کدها میدم.

خط ۶ : یه اشاره گر تعریف کردم، و یه آرایه به اندازه ۲۰، که میخوام آدرس این آرایه رو بدم به اشاره گر، اشاره گر بعد از تعریف آدرس نداره که، لذا باس قبل از این که مقدار بهش بدی، آدرسش رو بهش بدی. که عمل دادن آدرس در خط ۷ انجام شده که آدرس آرایه رو دادم به اشاره گر(نام آرایه هم همون طور که میدونید یه اشاره گر ثابت هستش که به خونه اول آرایه اشاره میکنه)، البته روش های بهتری(دیگه ای) برای این عمل آدرس دهی وجود داره که در ادامه و در عناوین بعدی توضیح میدم.
خطوط ۱۶-۱۲ : این یه روش مقدار دهی که آشنا هستید باهاش، و تو خطوط ۲۴ تا ۲۸ هم هثل یه آرایه مقدار دهیش کردم، کلا سعی کنید این اشاره گرها رو خوب یاد بگیرید، چون اگه بخواین حرفیه ای C رو یاد بگیرید لازمتون میشه.
خطوط ۱۸ و ۳۰ هم برا نمایش دیتای ذخیره شده در اشاره گر هستش.
توجه مهم : همون طور که میبینید تو خطوط ۱۵ و ۲۷ اومدم مقدار '۰\' رو به اشاره گر دادم(خونه ۴ ام، شمارش خونه ها از ۰ شروع میشه و اگه داخل براکت های آرایه عدد ۳ رو بزاریم یعنی خونه ۴ام آرایه)، که یعنی پایان رشته، لذا اگه خونه بعدی رو هم مقدار دهی کنم(خطوط ۱۶ و ۲۸)، هنگام نمایش دیتا در نظر گرفته نمیشوند.

دریافت و ذخیره داده در رشته هایی از نوع اشاره گر

خب تو این برنامه گفتم یه مثال هم بزنم از این که یه داده رو از ورودی دریافت کنیم و در اشاره گر ذخیره کنیم، فقط خواستم با روشش آشنا بشید، چون اگه روشش رو یاد بگیرید تو میکروکنترلر ها هم میتونید ازش استفاده کنید، و نگید کد نوشتن تو این محیط(کنسول اپلیکیشن) جه فایده ای داره آخه، حدف یادگری سریع هستش و یاد گرفتن اصل مطلب و...
تو این مثال من از ۲ روش برا دریافت اطلاعات و ذخیره کردن تو رشته(از نوع اشاره گر) استفاده کردم،
روش۱) اطلاعات رو تا زمانی که به کاراکتر ممنوعه نرسیدیم ادامه میده، که در اینجا من گفتم هر موقع کاربر  کاراکتر m رو ارسال کرد، بیا و دریافت داده رو خاتمه بده و کاراکتر پایانی رشته رو اضافه کن و داده دریافتی رو نمایش بده، که این طوری باید از یه کاراکتر صرف نظر کنید، مثلا کاراکتری که اصلا بکارتون نماید رو برا پایان دادن به دریافت تعیین کنید، مثلا کاراکتر ! رو تعیین کنید.(اینا که میگم تو برنامه نویسی میکرو هم هستشا، یه وقت فک نکنید فقط برا این محیط هستش و...)
روش۲) این روش میاد بررسی میکنه که تا زمانی که حروف کوچک و یا بزگ الفبای انگلیسی و یا اعداد ۰ تا ۹ وارد شده، دریافت داده رو ادامه بده و وقتی کاراکتری غیر از اینها وارد شد، دریافت داده رو متوقف کن و کاراکتر پایان دهنده به رشته رو تو رشته قرار بده و بعد بیا نمایش بده
توجه مهم : اگه کاراکتر پایانی وارد نشه، هنگام نمایش اطلاعات، کامپیوتر نمیدونه این اشاره گر یه رشته هستش و فقط کاراکتر اول ذخیره شده رو نشون میده و پایان رشته مشخص نیست و...(و برا کارای آینده به مشکل بر میخورین برای کار با این نوع رشته که کاراکتر پایانیش وارد نشده است)

 

نحوه محاسبه طول رشته

خب ما در بالا انواع روش تعریف یه رشته رو گفتم!(یعنی رعایت قواعد زبان فارسی تو حلقم)، حالا فرض کنید یه رشته داریم و طولش رو نیاز داریم(داشتم برا NRF کتابخونه مینوشتم دیدم یه همچین تابعی نیاز هستش، گفتم آموزشش رو هم اینجا بزارم و بعدا هنگام نوشتن مطلب مربوط به NRF ارجاع بدم شما رو به این مطلب :-D)
خب میگفتم، مثلا فرض کنید یه رشته رو به یه تابعی ارسال کردیم و در اون تابع طول رشته برامون مهم هستش، لذا باس طولش رو محاسبه کنیم laugh چاره ای نداریم و باس محاسبه کنیم، حالا چطور میشه این کار رو کرد؟؟؟ >>> خب همون طور که قبلا گفتم آخرین خونه هر رشته و آرایه یه کاراکتر هستش با کد اسکی ۰ که به صورت '۰\' مشخصش میکنن، حالا ما کاری که باید بکنیم اینه که بیایم بررسی کنیم ببینیم که کدوم خونه از آرایه یا رشته مقدارش برابر این کاراکتر هستش.....به همین راحتی و خوشمزگی cool  یه برنامه نمونه در زیر میزارم که با توضیحاتی! که الان دادم حتما باس متوجه نحوه کار برنامه زیر بشید(البته برای این کار توابعی هم فک کنم باشه ولی...) :

نمیدونم چیزی مونده که نگفته باشم یا نه، خودم گیج شدم wacko

یه سری نکات مختص آردوینو و کدویژن : برا تعریف متغییر های String در آردوینو باید اون حرف اول(S) با حروف بزرگ نوشته شود، یعنی string اشتباه هستش و String درست هستش، و از انواع روش های دیگه تعریف رشته هم میتونید استفاده کنید.(چون زبان برنامه نویسی کامپایلر آردوینو ++C هستش)، البته درباره کتابخونه کار با رشته ها در آردوینو بعدا یه مطلبی میزارم(اگه یادم بود، اگه یادم رفت و دیدید زمان زیادی از انتشار این مطلب گزشته و من هنوز مطلبش رو نزاشتم بهم خبر بدید blush ) هر چند خود این موضوع یه مطلب خیلی بزرگی میشه، کدویژن هم که زبونش C هستش و String رو ساپورت نمیکنه و باید از اون ۳ روش دیگه استفاده کرد.

چیزایی که نگفتم : عناوین زیر و بعضی از نواقص این مطلب و یه سری چیزای دیگه رو هم بعدا میگم، دیگه نفسم بند اومد، این مطلب الان ۴۸۰۰ تا واژه تاره تقریبا، خسته شدم جان داش 

۹) آرایه ها و اشاره گرها

۹) آرایه ها و اشاره گرها

خالی کردن خونه های آرایه

خب همون طور که میدونید، اگه یه آرایه با طول ۳۲ بایت داشته باشیم، و بخوایم توش دفه اول ۲۰ بایت ذخیره کنیم و نمایشش بدیم مشکلی نداریم اما مشکل زمانی ایجاد میشه که ما بخوایم دفه بعد داخل آرایه ۵ بایت مثلا(ار تعداد بایت های دفعه اول حداقل یه دونه کمتر باشه) بریزیم و بعد نشونش بدیم(داخل پنجره سریال، داخل lcd و...) میبینیم که اون ۲۰ بایت قبلی و بعد این ۵ بایت رو نشون میده >>>> در حالی که ما توقع داشتیم فقط همون ۵ بایت رو نشون بده>>>> حالا چرا این مشکل پیش اومده؟>>> چون دفعه قبل دیتا ریختیم پاکش نکردیم، اگه پاکش میکردیم، دیتای ۵ بایتی بعدی(مثلا ۵ بایت) از خونه اول آرایه شروع به ذخیره شدن داخل آرایه میکرد به جای این که از خونه ۲۰ ام شروع به ذخیره شدن بکنه.
جان داش هر چی سعی کردم خوب توضیح بدم نتونستم، کسی اگه توضیح بهتری داره بگه تا جایگزین کنم، در زیر کد این قسمت رو میزارم :

۱۰) حافظه پویا و عملگرهای new و delete

۱۱) اشاره گر هایی که به یه آدرس از حافظه اشاره میکنن

این فیلم رو هم ببینید : اهمیت اشاره گر ها در پردازش تصویر

 

عجبا، اومدیم برا نوشتن کتابخونه NRF یه مطلب بنویسیم، دیدم کسی در این زمینه فعالیت نکرده، رفتیم دیتاشیت ۷۰ صفحه NRF رو با زور و زحمت فراوان ترجمه کردیم sarcastic ، وسط ترجمه بعضی اصطلاحات رو نمیفهمیدم dash ، سرچ میکردم و به عنوان یه توضیح ته دیتاشیت اضافه میکرم و اگه چیزی پیدا نمیکردم، اونو میپرسیدم و ….، دیدیدم آموزش Spi در آردوینو رو باید بگم(که گفتم)، ۰ و ۱ کردن بیت هایی از یه ریجستر رو باید بگم(که گفتم)، بحث اشاره گر رو بگم(که الان گفتم ^_^)، خواستم بحث انواع روش ارسال داده به تابع(که تقریبا مربوط میشه به اشاره گرها) رو بگم دیدم خودش یه مطلبه(البته تا یجاییش رو تو این مطلب گفتم ولی تصمیم گرفتم به عنوان یه مطلب جدا بزارم تو سایت چون خودش خیلی زیاد شد متن ها توضیحش!)، و بحث انواع تبدیل داده و  اشاره گر رو باید بگم(که در مطالب بعد میگم) و بعد میتونم مطلب nrf رو بگم cry ، امیدوارم مجبور نباشم مطلب دیگه ای رو هم بخوام بگم. bomb
شرمنده اگه مطلب طولانی شد، تمام سعی ام رو کردم که مطلب کامل و جامع باشه، اگه مثالی، سوالی چیزی تو ذهنتون بود مطرح کنید و در حد توان در خدمتیم.

خب این مطلب هم تموم شد رفت، هزینه این مطلب(که هر چند که قابلتون رو نداره laugh ) : دعا برا سلامتی مدافعان حرم و یه فاتحه برا شهدای مدافع حرم، ۳تا صلوات برا سلامتی رهبر، علمای اسلام و مسئولین خدمت گزار به کشور و اسلام و سلامتی ننه و بابا ها، و یه دعا برای ما ^_^

تعداد مطالب : 367 تا
جنگ ما فتح قدس را به همراه خواهد داشت. [ امام خمینی (ره) ]
بقیه جلسات : آموزش موضوعی CPP
ارسال دیدگاه
9

  1. حمید

    مهمان

    حمید

    سلام مهندس
    سوالی در مورد اشاره گرها در برنامه های تحت ویندوز دارم که از هر کسی پرسیدم جوابش رو نمیدونه . البته تو سایت برنامه نویس آقای شیری پاسخ دادن اما یک مقاله به زبان انگلیسی فرستادن که چون زبانم خوب نیست چیز زیادی ازش نفهمیدم . لطفا” اگر براتون مقدوره بنده رو راهنمایی کنید . ممنون
    پست شماره 19 در آدرس زیر
    http://barnamenevis.org/showthread.php?489627-%D8%B3%D9%88%D8%A7%D9%84-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D8%AD%D8%A7%D9%81%D8%B8%D9%87-text-code-stack-heap-static-global

  2. amin_teh

    مهمان

    amin_teh

    سلام
    یک برنامه دارم که به شکل زیر می خوام بنویسم در صورت امکان کمک کنید
    معرفی یک پین به عنوان خروجی #define Open_1 PORTA.0
    معرفی اشارگر char *Magnet, *Open, *Close ;
    بدنه برنامه
    if(F1==0)
    {
    n=0;
    Magnet= &Magnet_1;
    Open = &Open_1;
    Close = &Close_1;
    }
    if(F2==0)
    {
    n=1;
    Magnet= &Magnet_2;
    Open = &Open_2;
    Close = &Close_2;
    }
    توضیحات
    در این برنامه من خروجی ثابت تعریف کردم و با اشاره گر کفتم اگر این شرط برقرار بود منظور از مگنت همان مگنت 2 است
    و اگر شرط دیگر برقرار بود منظور از مگنت همان مگنت 1 است
    و برنامه های که لازم است را اجرا می کنم …

    مشاهده پاسخ ها (1)
  3. یاسر

    مهمان

    یاسر

    عالی بود… دست علی یارت باشه heart

  4. reza

    مهمان

    reza

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

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام – قاطی کردم – طول آرایه؟ که آدرسش برای یه تابع ارسال میشه – میخوای اندازه این آرایه رو حساب کنی؟
      خب خونه آخر ‘۰\’ داره.

  5. محمد ناصری

    مهمان

    محمد ناصری

    خیلی عالیه خدا کمکت کنه مهندس مهدی

  6. محمد ناصری

    مهمان

    محمد ناصری

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

  7. mostafa

    مهمان

    mostafa

    ضمن نهایت تشکر از دوست گرامی آقا مهدی دوست داشتنی