#cmap #map.h #map
🔵مَپ(map)
🔹کتابخانه map
⚠️ادامه پست قبلی
🔹عملگر ها (Operations)
🔻عملگر find
بدست آورن iterator برای عنصر (تابع عضو عمومی)
🔻عملگر count
شمردن عناصر با یک کلید مشخص (تابع عضو عمومی)
🔻عملگر lower_bound
بازگرداندن iterator به مرز پایین(تابع عضو عمومی)
🔻عملگر upper_bound
بازگرداندن iterator به مرز بالا(تابع عضو عمومی)
🔻عملگر equal_range
بدست آوردن محدوده عناصر مساوی (تابع عضو عمومی)
🔹تخصیص دهنده (Allocator)
🔻تخصیص دهنده get_allocator
گرفتن تخصیص دهنده (تابع عضو عمومی)
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵مَپ(map)
🔹کتابخانه map
⚠️ادامه پست قبلی
🔹عملگر ها (Operations)
🔻عملگر find
بدست آورن iterator برای عنصر (تابع عضو عمومی)
🔻عملگر count
شمردن عناصر با یک کلید مشخص (تابع عضو عمومی)
🔻عملگر lower_bound
بازگرداندن iterator به مرز پایین(تابع عضو عمومی)
🔻عملگر upper_bound
بازگرداندن iterator به مرز بالا(تابع عضو عمومی)
🔻عملگر equal_range
بدست آوردن محدوده عناصر مساوی (تابع عضو عمومی)
🔹تخصیص دهنده (Allocator)
🔻تخصیص دهنده get_allocator
گرفتن تخصیص دهنده (تابع عضو عمومی)
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
جهت دریافت لینک گروه سی پلاس پلاس و ساختمان داده:
@Qtcplusplus
📚 فهرست آموزش های کانال
📓 جلسه اول (مقدمات زبان ++C)
www.tgoop.com/Learncpp/534
📘 جلسه دوم (ساختارهای تکرار و تصمیم گیری)
www.tgoop.com/Learncpp/535
📗 جلسه سوم (آرایه ها)
www.tgoop.com/Learncpp/536
📙 جلسه چهارم (توابع)
www.tgoop.com/Learncpp/537
📒 جلسه پنجم (اشاره گرها)
در حال آموزش...
www.tgoop.com/Learncpp/2319
📽 فیلم های آموزشی
www.tgoop.com/Learncpp/538
💻 نرم افزار های مرتبط
www.tgoop.com/Learncpp/540
🙇🏻 دانستنی ها
www.tgoop.com/Learncpp/539
🌐 کامپایلر، IDE، کتاب برنامه نویسی و...
www.tgoop.com/Learncpp/362
🌍 ترجمه کتابخانه ها از سایت مرجع برنامه نویسان ++C
www.cplusplus.com
🔹وکتور (vector)
www.tgoop.com/Learncpp/1029
🔹رشته ها (string)
www.tgoop.com/Learncpp/1030
🔹عملیات ورودی/خروجی (cstdio)
www.tgoop.com/Learncpp/1194
🔹زمان (time)
www.tgoop.com/Learncpp/1414
🔹سیگنال (signal)
www.tgoop.com/Learncpp/1672
🔹مپ (map)
www.tgoop.com/Learncpp/2319
🔸کتابخانه بعدی درحال ترجمه است
⛔️ از آنجا که مطالب کانال از جایی کپی پیست و دزدیده نمی شوند همچنین یکی از اهداف اصلی کانال پوشش دادن ریز به ریز و کامل مطالب است تا خواننده درک درست و کاملی از آموزش ها داشته باشد، به همین خاطر ابتدا تمامیه مطالب درون word تایپ سپس پس از تکمیل به صورت رایگان داخل کانال قرار می گیرند، پس به دلیل جمع آوری مطالب ممکن است مدت زمانی درون کانال آموزشی قرار نگیرد به همین دلیل "لطفا صبر پیشه کنید"...
🎁 دوستانی که مشتاق به ترجمه کتابخانه های سی پلاس پلاس از سایت رسمی Cplusplus.com هستند یا تمایل به آموزش موضوعات مرتبط با سی پلاس را دارند (به صورت رایگان) به آیدی @QtCplusplus پیام بدن تا هماهنگی های لازم انجام شده و در انتها زحمات افراد همراه مشخصاتشان برای عموم داخل کانال @Learncpp منتشر شود🌹
❤️ تبلیغات ارزانتر == شاد کردن قلب بچه های سرطانی😊🌹
💝 @cancerchilds
آموزش تخصصی ➕➕©
🌈 @Learncpp
@Qtcplusplus
📚 فهرست آموزش های کانال
📓 جلسه اول (مقدمات زبان ++C)
www.tgoop.com/Learncpp/534
📘 جلسه دوم (ساختارهای تکرار و تصمیم گیری)
www.tgoop.com/Learncpp/535
📗 جلسه سوم (آرایه ها)
www.tgoop.com/Learncpp/536
📙 جلسه چهارم (توابع)
www.tgoop.com/Learncpp/537
📒 جلسه پنجم (اشاره گرها)
در حال آموزش...
www.tgoop.com/Learncpp/2319
📽 فیلم های آموزشی
www.tgoop.com/Learncpp/538
💻 نرم افزار های مرتبط
www.tgoop.com/Learncpp/540
🙇🏻 دانستنی ها
www.tgoop.com/Learncpp/539
🌐 کامپایلر، IDE، کتاب برنامه نویسی و...
www.tgoop.com/Learncpp/362
🌍 ترجمه کتابخانه ها از سایت مرجع برنامه نویسان ++C
www.cplusplus.com
🔹وکتور (vector)
www.tgoop.com/Learncpp/1029
🔹رشته ها (string)
www.tgoop.com/Learncpp/1030
🔹عملیات ورودی/خروجی (cstdio)
www.tgoop.com/Learncpp/1194
🔹زمان (time)
www.tgoop.com/Learncpp/1414
🔹سیگنال (signal)
www.tgoop.com/Learncpp/1672
🔹مپ (map)
www.tgoop.com/Learncpp/2319
🔸کتابخانه بعدی درحال ترجمه است
⛔️ از آنجا که مطالب کانال از جایی کپی پیست و دزدیده نمی شوند همچنین یکی از اهداف اصلی کانال پوشش دادن ریز به ریز و کامل مطالب است تا خواننده درک درست و کاملی از آموزش ها داشته باشد، به همین خاطر ابتدا تمامیه مطالب درون word تایپ سپس پس از تکمیل به صورت رایگان داخل کانال قرار می گیرند، پس به دلیل جمع آوری مطالب ممکن است مدت زمانی درون کانال آموزشی قرار نگیرد به همین دلیل "لطفا صبر پیشه کنید"...
🎁 دوستانی که مشتاق به ترجمه کتابخانه های سی پلاس پلاس از سایت رسمی Cplusplus.com هستند یا تمایل به آموزش موضوعات مرتبط با سی پلاس را دارند (به صورت رایگان) به آیدی @QtCplusplus پیام بدن تا هماهنگی های لازم انجام شده و در انتها زحمات افراد همراه مشخصاتشان برای عموم داخل کانال @Learncpp منتشر شود🌹
❤️ تبلیغات ارزانتر == شاد کردن قلب بچه های سرطانی😊🌹
💝 @cancerchilds
آموزش تخصصی ➕➕©
🌈 @Learncpp
#pointer #اشاره_گر
🔵 نحوهی ذخیرهسازی اطلاعات در حافظه
یک سیم را در نظر بگیرید، برای این سیم دو حالت بیشتر وجود ندارد:
0⃣ جریان برق از آن عبور نمیکند.
1️⃣جریان برق از آن عبور میکند.
از آنجایی که کامپیوترها با برق کار میکنند تنها راه ارتباط با آنها از همین طریق است؛ یعنی یا صفر یا یک، که به آن «مبنای دو» یا «باینری» (Binary) نیز میگویند.
🔹بیت (bit)
کوچکترین واحد ذخیرهسازی اطلاعات در کامپیوتر، بیت است؛ مقدار ذخیره شده در هر بیت میتواند "صفر" یا "یک" باشد.
🔹بایت (Byte)
هر بایت شامل 8 بیت میباشد؛ به این ترتیب کوچکترین عدد ذخیره شده در یک بایت صفر است که معادل باینری آن 00000000 میباشد و بزرگترین عدد ذخیره شده در یک بایت 255 است که معادل باینری آن 11111111 میباشد. بنابراین هر بایت میتواند 256 عدد (از صفر تا 255) را در خود ذخیره کند.
🔹حافظه (Memory)
برای ذخیرهسازی اطلاعات در کامپیوتر از یک سختافزار (Hardware) به نام حافظه کمک میگیریم. حافظه انواع مختلفی دارد از جمله:
حافظهی فقط خواندنی (ROM)
حافظهی تصادفی (RAM)
حافظهی خارجی (External Storage)
حافظه از تعداد زیادی «خانه» تشکیل شده است که هر کدام از آنها نمایندهی یک بایت یا 8 بیت میباشند. برای متمایز کردن این خانهها از یکدیگر به هر کدام از آنها یک «آدرس» تخصیص داده میشود. با در اختیار داشتن آدرس یک خانه از حافظه میتوان مقدار ذخیره شده در آن را تغییر داد.
شکل کُلی خانههای حافظه را میتوانید در پُست www.tgoop.com/Learncpp/2321 مشاهده کنید.
@Learncpp
🔵 نحوهی ذخیرهسازی اطلاعات در حافظه
یک سیم را در نظر بگیرید، برای این سیم دو حالت بیشتر وجود ندارد:
0⃣ جریان برق از آن عبور نمیکند.
1️⃣جریان برق از آن عبور میکند.
از آنجایی که کامپیوترها با برق کار میکنند تنها راه ارتباط با آنها از همین طریق است؛ یعنی یا صفر یا یک، که به آن «مبنای دو» یا «باینری» (Binary) نیز میگویند.
🔹بیت (bit)
کوچکترین واحد ذخیرهسازی اطلاعات در کامپیوتر، بیت است؛ مقدار ذخیره شده در هر بیت میتواند "صفر" یا "یک" باشد.
🔹بایت (Byte)
هر بایت شامل 8 بیت میباشد؛ به این ترتیب کوچکترین عدد ذخیره شده در یک بایت صفر است که معادل باینری آن 00000000 میباشد و بزرگترین عدد ذخیره شده در یک بایت 255 است که معادل باینری آن 11111111 میباشد. بنابراین هر بایت میتواند 256 عدد (از صفر تا 255) را در خود ذخیره کند.
🔹حافظه (Memory)
برای ذخیرهسازی اطلاعات در کامپیوتر از یک سختافزار (Hardware) به نام حافظه کمک میگیریم. حافظه انواع مختلفی دارد از جمله:
حافظهی فقط خواندنی (ROM)
حافظهی تصادفی (RAM)
حافظهی خارجی (External Storage)
حافظه از تعداد زیادی «خانه» تشکیل شده است که هر کدام از آنها نمایندهی یک بایت یا 8 بیت میباشند. برای متمایز کردن این خانهها از یکدیگر به هر کدام از آنها یک «آدرس» تخصیص داده میشود. با در اختیار داشتن آدرس یک خانه از حافظه میتوان مقدار ذخیره شده در آن را تغییر داد.
شکل کُلی خانههای حافظه را میتوانید در پُست www.tgoop.com/Learncpp/2321 مشاهده کنید.
@Learncpp
#pointer #اشاره_گر
🔵 جدول کُدهای ASCII
همانطور که پیشتر اشاره شد "هر بایت میتواند 256 عدد (از صفر تا 255) را در خود ذخیره کند"، بنابراین میتوان 256 کاراکتر مختلف را در یک بایت ذخیره کرد. به صورت قرار دادی جدولی به نام "جدول کُدهای ASCII" برای این کار ساخته شد؛ در این جدول هر کاراکتر با یک عدد منحصر به فرد از صفر تا 255 متناظر شده است.
جدول کامل کُدهای ASCII را میتوانید در سایت ascii-code.com مشاهده کنید.
@Learncpp
🔵 جدول کُدهای ASCII
همانطور که پیشتر اشاره شد "هر بایت میتواند 256 عدد (از صفر تا 255) را در خود ذخیره کند"، بنابراین میتوان 256 کاراکتر مختلف را در یک بایت ذخیره کرد. به صورت قرار دادی جدولی به نام "جدول کُدهای ASCII" برای این کار ساخته شد؛ در این جدول هر کاراکتر با یک عدد منحصر به فرد از صفر تا 255 متناظر شده است.
جدول کامل کُدهای ASCII را میتوانید در سایت ascii-code.com مشاهده کنید.
@Learncpp
#pointer #اشاره_گر
🔵 انواع متغیرها
علاوه بر بیت و بایت متغیرهای دیگری نیز برای ذخیرهسازی اطلاعات وجود دارند؛ البته نحوهی ذخیرهسازی مقادیر در تمام آنها یکسان است اما در پارهای موارد از جمله "مقدار حافظهی اشغال شده" و "نحوهی مقدار دهی" با یکدیگر متفاوت هستند.
در اینجا به بیان مشخصات چند نوع مهم از متغیرها میپردازیم.
🔹عدد صحیح (int)
🔻حافظهی اشغال شده
4 بایت معادل 32 بیت
🔻کوچک ترین عدد ذخیره شده
-2,147,483,648
🔻بزرگ ترین عدد ذخیره شده
+2,147,483,647
🔺چون عدد صفر جزءِ اعداد مثبت در نظر گرفته شده است، تعداد اعداد مثبت یک واحد کمتر از تعداد اعداد منفی است.
🔹عدد اعشاری با دقت کم (float)
🔻حافظهی اشغال شده
4 بایت معادل 32 بیت
🔻کوچک ترین عدد ذخیره شده
1.175494351 E – 38
🔻بزرگ ترین عدد ذخیره شده
3.402823466 E + 38
🔹عدد اعشاری با دقت زیاد (double)
🔻حافظهی اشغال شده
8 بایت معادل 64 بیت
🔻کوچک ترین عدد ذخیره شده
2.2250738585072014 E – 308
🔻بزرگ ترین عدد ذخیره شده
1.7976931348623158 E + 308
🔺هر دو نوعِ float و double برای ذخیره سازی اعداد اعشاری به کار میروند با این تفاوت که نوعِ double امکانِ ذخیرهسازیِ تعدادِ ارقامِ اعشاریِ بیش تری را فراهم میکند.
🔹کاراکتر (char)
🔻حافظهی اشغال شده
1 بایت معادل 8 بیت
🔻کوچک ترین عدد ذخیره شده
0
🔻بزرگ ترین عدد ذخیره شده
255
جدول کاملِ انواع متغیرها را میتوانید در پُست بعد مشاهده کنید.
@Learncpp
🔵 انواع متغیرها
علاوه بر بیت و بایت متغیرهای دیگری نیز برای ذخیرهسازی اطلاعات وجود دارند؛ البته نحوهی ذخیرهسازی مقادیر در تمام آنها یکسان است اما در پارهای موارد از جمله "مقدار حافظهی اشغال شده" و "نحوهی مقدار دهی" با یکدیگر متفاوت هستند.
در اینجا به بیان مشخصات چند نوع مهم از متغیرها میپردازیم.
🔹عدد صحیح (int)
🔻حافظهی اشغال شده
4 بایت معادل 32 بیت
🔻کوچک ترین عدد ذخیره شده
-2,147,483,648
🔻بزرگ ترین عدد ذخیره شده
+2,147,483,647
🔺چون عدد صفر جزءِ اعداد مثبت در نظر گرفته شده است، تعداد اعداد مثبت یک واحد کمتر از تعداد اعداد منفی است.
🔹عدد اعشاری با دقت کم (float)
🔻حافظهی اشغال شده
4 بایت معادل 32 بیت
🔻کوچک ترین عدد ذخیره شده
1.175494351 E – 38
🔻بزرگ ترین عدد ذخیره شده
3.402823466 E + 38
🔹عدد اعشاری با دقت زیاد (double)
🔻حافظهی اشغال شده
8 بایت معادل 64 بیت
🔻کوچک ترین عدد ذخیره شده
2.2250738585072014 E – 308
🔻بزرگ ترین عدد ذخیره شده
1.7976931348623158 E + 308
🔺هر دو نوعِ float و double برای ذخیره سازی اعداد اعشاری به کار میروند با این تفاوت که نوعِ double امکانِ ذخیرهسازیِ تعدادِ ارقامِ اعشاریِ بیش تری را فراهم میکند.
🔹کاراکتر (char)
🔻حافظهی اشغال شده
1 بایت معادل 8 بیت
🔻کوچک ترین عدد ذخیره شده
0
🔻بزرگ ترین عدد ذخیره شده
255
جدول کاملِ انواع متغیرها را میتوانید در پُست بعد مشاهده کنید.
@Learncpp
🔹اشارهگر چیست؟
به متغیری که بتواند به آدرس های حافظه دسترسی داشته باشد اشارهگر گفته میشود.
🔹کاربرد اشارهگرها
1️⃣ تخصیص حافظهی پویا
2️⃣ فراخوانی با ارجاع
3️⃣ فراخوانی آدرس توابع
4️⃣ بهبود کار با آرایهها و رشتهها
5️⃣ گرفتنِ بیش از یک خروجی از تابع
🔹نحوهی تعریف اشارهگرها
🔺نوع type :
یکی از انواع دادههایی است که در www.tgoop.com/Learncpp/91 توضیح داده شده است.
🔺عملگر * :
با استفاده از عملگر * به کامپایلر میفهمانیم که متغیر ما از جنس اشارهگر است؛ یعنی متغیری از جنس اشارهگر تعریف کردهایم.
🔺variable
نام اشارهگر است که از قانون نامگذاری متغیرها تبعیت میکند.
به عنوان مثال در قطعه کُد زیر، دو اشارهگر به نامهای ptrX و ptrY تعریف کردهایم که از نوع int هستند:
🔸نکته :
متغیرهایی که قرار است اشارهگر را درون خود ذخیره کنند باید باهم، هم نوع باشند؛ مثلاً اگر متغیری به نام p از جنس int داریم، فقط به اشارهگری که از نوع int هست میتواند اشاره کند:
ولی در صورتی که متغیر به اشارهگری از نوع دادهای دیگر اشاره کرد با پیغام خطای زیر روبرو می شویم :
کد زیر را در نظر بگیرید:
که پس از اجرا به خطای زیر بر خواهیم خورد:
🔸توجه :
بهتر از برای درک و خوانایی بهترِ متغیرهای اشارهگر، ابتدای اسم هر متغیر عبارت ptr (مخفف pointer) را به کار ببریم؛ مثلا ً:
🔸توجه :
همواره پس از تعریف یک اشارهگر، آن را مقداردهی اولیه میکنیم، چون پس از تعریف، اشارهگر ممکن است به مکانی از حافظه اشاره کند که در آن قسمت از حافظه اطلاعات برنامهی دیگری موجود باشد که در نهایت باعث تغییر اطلاعات آن قسمت شود.
برای جلوگیری از مشکل بالا باید از کلمهی کلیدی null یا 0 (صفر) استفاده کرد تا به کامپایلر بفهمانیم که اشارهگر به جایی از حافظه اشاره نمیکند.
🔺عبارت null در کتابخانهی
قرار دارد.
@Learncpp
به متغیری که بتواند به آدرس های حافظه دسترسی داشته باشد اشارهگر گفته میشود.
🔹کاربرد اشارهگرها
1️⃣ تخصیص حافظهی پویا
2️⃣ فراخوانی با ارجاع
3️⃣ فراخوانی آدرس توابع
4️⃣ بهبود کار با آرایهها و رشتهها
5️⃣ گرفتنِ بیش از یک خروجی از تابع
🔹نحوهی تعریف اشارهگرها
type *variable;
🔺نوع type :
یکی از انواع دادههایی است که در www.tgoop.com/Learncpp/91 توضیح داده شده است.
🔺عملگر * :
با استفاده از عملگر * به کامپایلر میفهمانیم که متغیر ما از جنس اشارهگر است؛ یعنی متغیری از جنس اشارهگر تعریف کردهایم.
🔺variable
نام اشارهگر است که از قانون نامگذاری متغیرها تبعیت میکند.
به عنوان مثال در قطعه کُد زیر، دو اشارهگر به نامهای ptrX و ptrY تعریف کردهایم که از نوع int هستند:
int *ptrX , *ptrY;
🔸نکته :
متغیرهایی که قرار است اشارهگر را درون خود ذخیره کنند باید باهم، هم نوع باشند؛ مثلاً اگر متغیری به نام p از جنس int داریم، فقط به اشارهگری که از نوع int هست میتواند اشاره کند:
int *ptrP , g;
g = 12;
ptrP = &g;
cout << *ptrP; //12
ولی در صورتی که متغیر به اشارهگری از نوع دادهای دیگر اشاره کرد با پیغام خطای زیر روبرو می شویم :
کد زیر را در نظر بگیرید:
double g = 12;
int * p ;
p = &g;
cout << *p << endl;
که پس از اجرا به خطای زیر بر خواهیم خورد:
error: cannot convert double* to int* in assignment
🔸توجه :
بهتر از برای درک و خوانایی بهترِ متغیرهای اشارهگر، ابتدای اسم هر متغیر عبارت ptr (مخفف pointer) را به کار ببریم؛ مثلا ً:
int *ptrCount;
🔸توجه :
همواره پس از تعریف یک اشارهگر، آن را مقداردهی اولیه میکنیم، چون پس از تعریف، اشارهگر ممکن است به مکانی از حافظه اشاره کند که در آن قسمت از حافظه اطلاعات برنامهی دیگری موجود باشد که در نهایت باعث تغییر اطلاعات آن قسمت شود.
برای جلوگیری از مشکل بالا باید از کلمهی کلیدی null یا 0 (صفر) استفاده کرد تا به کامپایلر بفهمانیم که اشارهگر به جایی از حافظه اشاره نمیکند.
🔺عبارت null در کتابخانهی
<cstddef> <cstdlib> <cstring> <cwchar> <ctime> <clocale> <cstdio>
قرار دارد.
@Learncpp
#pointer #اشاره_گر
🔹عملگر های مربوط به اشارهگر :
در رابطه با استفاده از اشارهگر ها دو عملگرِ * و & مورد استفاده قرار میگیرند.
🔺عملگر * :
برای تعریف یک اشارهگر و هم چنین مشخص کردن محتویات جایی که متغیر اشارهگرش به آن اشاره میکند استفاده میشود.
🔺عملگر & :
آدرس جایی که متغیر اشارهگرش به آن اشاره می کند را بر میگرداند.
به عنوان مثال به این قطعه کُد توجه کنید:
کُد بالا یک متغیر صحیحِ 4 بایتی به نام x در خط بعد یک متغیر 8 بایتی به نام y و در نهایت دو اشارهگر صحیحِ 4 بایتی با نام ptrP1 و نام ptrP2 ایجاد میکند.
فرض کنید متغیر x در خانهی 100 حافظه باشد و چون 4 بایت است پس 4 بایت از حافظه را اشغال میکند هم چنین فرض کنید متغیر y در خانهی 105 حافظه باشد و چون 8 بایت است پس 8 بایت از حافظه را اشغال میکند.
حال دستور 1️⃣ باعث میشود اشارهگر ptrP1 به x و دستور 2️⃣ باعث میشود
اشارهگر ptrP2 به y اشاره کند.
🔺اما اگر برنامهی بالا را اجرا کنیم، جواب درستی نخواهیم گرفت ؛ چرا
اگر ما اشارهگر ptrP1 را چاپ کنیم عدد 2017 چاپ خواهد شد ولی اگر اشارهگر ptrP2 را چاپ کنیم عدد 1396 چاپ نخواهد شد و جواب یا چیز دیگری است یا کامپایلر خطا میگیرد، چرا که متغیر y هشت بایت از حافظه را اشغال میکند اما اشارهگر ptrP2 تنها میتواند به چهار بایت اشاره کند؛ این یعنی از 8 بایت متغیر y فقط 4 بایت اولش درون اشارهگر ptrP2 ریخته میشود و 4 بایت بعدی گم میشد یا کامپایلر خطا میگیرد.
🔸پس باید همیشه توجه داشته باشیم متغیرها با اشارهگرها همنوع باشند تا با خطا یا نتیجهی نادرستی روبهرو نشویم.
🔺برای حل مشکل بالا میتوانیم نوع ptrP2 را به double تغییر دهیم:
@Learncpp
🔹عملگر های مربوط به اشارهگر :
در رابطه با استفاده از اشارهگر ها دو عملگرِ * و & مورد استفاده قرار میگیرند.
🔺عملگر * :
برای تعریف یک اشارهگر و هم چنین مشخص کردن محتویات جایی که متغیر اشارهگرش به آن اشاره میکند استفاده میشود.
🔺عملگر & :
آدرس جایی که متغیر اشارهگرش به آن اشاره می کند را بر میگرداند.
به عنوان مثال به این قطعه کُد توجه کنید:
int x;
double y;
int *ptrP1 , *ptrP2;
x = 2018;
y = 1397;
ptrP1 = &x; //
1️⃣ptrP2 = &y; //
2️⃣کُد بالا یک متغیر صحیحِ 4 بایتی به نام x در خط بعد یک متغیر 8 بایتی به نام y و در نهایت دو اشارهگر صحیحِ 4 بایتی با نام ptrP1 و نام ptrP2 ایجاد میکند.
فرض کنید متغیر x در خانهی 100 حافظه باشد و چون 4 بایت است پس 4 بایت از حافظه را اشغال میکند هم چنین فرض کنید متغیر y در خانهی 105 حافظه باشد و چون 8 بایت است پس 8 بایت از حافظه را اشغال میکند.
حال دستور 1️⃣ باعث میشود اشارهگر ptrP1 به x و دستور 2️⃣ باعث میشود
اشارهگر ptrP2 به y اشاره کند.
🔺اما اگر برنامهی بالا را اجرا کنیم، جواب درستی نخواهیم گرفت ؛ چرا
اگر ما اشارهگر ptrP1 را چاپ کنیم عدد 2017 چاپ خواهد شد ولی اگر اشارهگر ptrP2 را چاپ کنیم عدد 1396 چاپ نخواهد شد و جواب یا چیز دیگری است یا کامپایلر خطا میگیرد، چرا که متغیر y هشت بایت از حافظه را اشغال میکند اما اشارهگر ptrP2 تنها میتواند به چهار بایت اشاره کند؛ این یعنی از 8 بایت متغیر y فقط 4 بایت اولش درون اشارهگر ptrP2 ریخته میشود و 4 بایت بعدی گم میشد یا کامپایلر خطا میگیرد.
🔸پس باید همیشه توجه داشته باشیم متغیرها با اشارهگرها همنوع باشند تا با خطا یا نتیجهی نادرستی روبهرو نشویم.
🔺برای حل مشکل بالا میتوانیم نوع ptrP2 را به double تغییر دهیم:
int x;
double y;
int *ptrP1 ;
double *ptrP2;
x = 2018;
y = 1397;
ptrP1 = &x;
ptrP2 = &y;
@Learncpp
🔵 اشارهگر (Pointer)
🔹اشارهگر ثابت (Constant Pointer)
زمانی که بخواهیم اشارهگر تنها قابلیت خواندن مکانی از حافظه را داشته باشد، آن را به صورت "ثابت" تعریف میکنیم؛ با این کار میتوانیم "آدرسهای" متفاوتی را داخل اشارهگر ذخیره کنیم اما نمیتوانیم "مقادیر" آنها را تغییر دهیم و صرفاً میتوان مقادیر آنها را خواند و مورد استفاده قرار داد.
به عنوان مثال تابع زیر دو مکان از حافظه را به عنوان ورودی میگیرد و مقادیری از حافظه را که بین این دو قرار دارند به کاربر نمایش میدهد:
🔺همان طور که میبینید ما نیازی به تغییر مقادیر ذخیره شده در حافظه نداشتیم، بنابراین از اشارهگر با مقدار ثابت استفاده کردیم.
با این حال در دستور 1️⃣ آدرس اشارهگر را تغییر دادیم، چرا که صرفاً "مقدار" اشارهگر ثابت است نه "آدرس" آن؛ برای اینکه آدرس اشارهگر هم ثابت تعریف شود و نتوان آن را تغییر داد میتوانیم از دستور زیر برای تعریف اشارهگر p استفاده کنیم :
🔺دقت کنید که حتماً در زمان تعریف اشارهگر ثابت، باید آن را مقداردهی کرد همچنین هر دو دستور زیر تنها یک اشارهگر، با "مقدار" ثابت به وجود میآورد :
@Learncpp
🔹اشارهگر ثابت (Constant Pointer)
زمانی که بخواهیم اشارهگر تنها قابلیت خواندن مکانی از حافظه را داشته باشد، آن را به صورت "ثابت" تعریف میکنیم؛ با این کار میتوانیم "آدرسهای" متفاوتی را داخل اشارهگر ذخیره کنیم اما نمیتوانیم "مقادیر" آنها را تغییر دهیم و صرفاً میتوان مقادیر آنها را خواند و مورد استفاده قرار داد.
به عنوان مثال تابع زیر دو مکان از حافظه را به عنوان ورودی میگیرد و مقادیری از حافظه را که بین این دو قرار دارند به کاربر نمایش میدهد:
void showNumbersBetween (const int *first , const int *last )
{
const int * current = first;
while ( current != last )
{
cout << *current << endl;
current++; // 1️⃣
}
}
🔺همان طور که میبینید ما نیازی به تغییر مقادیر ذخیره شده در حافظه نداشتیم، بنابراین از اشارهگر با مقدار ثابت استفاده کردیم.
با این حال در دستور 1️⃣ آدرس اشارهگر را تغییر دادیم، چرا که صرفاً "مقدار" اشارهگر ثابت است نه "آدرس" آن؛ برای اینکه آدرس اشارهگر هم ثابت تعریف شود و نتوان آن را تغییر داد میتوانیم از دستور زیر برای تعریف اشارهگر p استفاده کنیم :
int x = 0;
const int * const p = &x;
🔺دقت کنید که حتماً در زمان تعریف اشارهگر ثابت، باید آن را مقداردهی کرد همچنین هر دو دستور زیر تنها یک اشارهگر، با "مقدار" ثابت به وجود میآورد :
const int * p = &x;
int const * p = &x;
@Learncpp
🇮🇷سال 1398 را به همه ی اعضای کانال تبریک میگم 🌹😊
برامون آرزوهای خوب کنید
@Learncpp
برامون آرزوهای خوب کنید
# include<Noroz.h>
# include<Bahar.h>
void main()
{
for(i=0;ta akhar sale 98;i++)
printf("Happy new year 1398🌺@learncpp🌺")
getch();
return 0;
}
@Learncpp
🔴 مقایسه زبان C با ++C
#ویژگیها
در مقایسه با C زبان ++C ویژگیهای جدیدی را معرفی نموده است مانند تعریف متغیر به عنوان عبارت، تغییر نوعهای همانند تابع، اضافه/حذف، نوع داده bool، توابع درونخطی، آرگومان های پیش فرض، گران بارسازی عملگر و تابع ، فضای نام و عملگر تعیین حوزه ، کلاسها (شامل تمام ویژگیهای مربوط به کلاسها همانند وراثت، اعضای تابع، توابع مجازی، کلاسهای انتزاعی، و سازندهها)، قالبها، پردازش استثناء، کنترل نوع ، زمان اجرا، عملگرهای سربار شده ورودی (<<) و خروجی (>>)
🆔 @Learncpp
🔻برخلاف باور عموم ++C نوع داده ثابت را معرفی ننمودهاست.کلمه const کمی پیش از استفاده از این کلمه در ++C توسط زبان C به صورت رسمی به کار گرفته شد.
🆔 @Learncpp
🔻در بعضی حالات ++C تعداد کنترل نوع بیشتری نسبت به زبان C انجام میدهد. (برای اطلاعات بیشتر بخش «ناهماهنگی با C» را در پایین ببینید)
👈توضیحات با استفاده از // قبل از زبان C در زبان BCPL معرفی شده بود که مجدداً در زبان ++C به کار گرفته شد.
🆔 @Learncpp
🔻بعضی ویژگیهای ++C بعداً توسط C به کار گرفته شد مانند نحوه تعریف for، توضیحات به شکل ++C (با استفاده از //)، و کلمه inline با وجود اینکه تعریف این کلمه در C با تعریف آن در زبان ++C هماهنگی ندارد
🆔@Learncpp
🔻هم چنین در C ویژگیهایی معرفی شده است که در ++C وجود ندارند مانند ماکروهای قابل تغییر و استفاده بهتر از آرایهها به عنوان آرگومان. بعضی کامپایلرها این ویژگیها را پیاده نمودهاند اما در بقیه این ویژگیها موجب ناهماهنگی میگردد.
🆔 @Learncpp
#ویژگیها
در مقایسه با C زبان ++C ویژگیهای جدیدی را معرفی نموده است مانند تعریف متغیر به عنوان عبارت، تغییر نوعهای همانند تابع، اضافه/حذف، نوع داده bool، توابع درونخطی، آرگومان های پیش فرض، گران بارسازی عملگر و تابع ، فضای نام و عملگر تعیین حوزه ، کلاسها (شامل تمام ویژگیهای مربوط به کلاسها همانند وراثت، اعضای تابع، توابع مجازی، کلاسهای انتزاعی، و سازندهها)، قالبها، پردازش استثناء، کنترل نوع ، زمان اجرا، عملگرهای سربار شده ورودی (<<) و خروجی (>>)
🆔 @Learncpp
🔻برخلاف باور عموم ++C نوع داده ثابت را معرفی ننمودهاست.کلمه const کمی پیش از استفاده از این کلمه در ++C توسط زبان C به صورت رسمی به کار گرفته شد.
🆔 @Learncpp
🔻در بعضی حالات ++C تعداد کنترل نوع بیشتری نسبت به زبان C انجام میدهد. (برای اطلاعات بیشتر بخش «ناهماهنگی با C» را در پایین ببینید)
👈توضیحات با استفاده از // قبل از زبان C در زبان BCPL معرفی شده بود که مجدداً در زبان ++C به کار گرفته شد.
🆔 @Learncpp
🔻بعضی ویژگیهای ++C بعداً توسط C به کار گرفته شد مانند نحوه تعریف for، توضیحات به شکل ++C (با استفاده از //)، و کلمه inline با وجود اینکه تعریف این کلمه در C با تعریف آن در زبان ++C هماهنگی ندارد
🆔@Learncpp
🔻هم چنین در C ویژگیهایی معرفی شده است که در ++C وجود ندارند مانند ماکروهای قابل تغییر و استفاده بهتر از آرایهها به عنوان آرگومان. بعضی کامپایلرها این ویژگیها را پیاده نمودهاند اما در بقیه این ویژگیها موجب ناهماهنگی میگردد.
🆔 @Learncpp
@Learncpp_Bjarne Stroustrup.pdf
3.3 MB