آموزش جامع پوینتر ها در زبان C ( پارت ۱ )

سلام به همه ی شما دوستان عزیز

بدون مقدمه و وقت تلف کردن بریم سراغ اصل مطلب

برای شما

میدونم که الان داری به این فک میکنی که این (*) لعنتی چیه توی زبان C و چندین بار قید زبان C رو زدی و رفتی پایتون یاد بگیری ? (مشکلی هم نیست همه براشون اتفاق افتاده )

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

خیلی ساده برام بگو پوینتر (اشاره گر) چیه ؟

یعنی یه آدرس حافظه (یه خونه از RAM کامپیوتر مثل0x7fff5694dc58) که میتونه به نوع خاصی اشاره کنه یا نکنه [ اوکیه؟ ]

نوع خاص منظورت چیه؟

یعنی پوینتر یا همون آدرس هگز (0x7fff5694dc58) میتونه آدرس شروع یه متغیر (مثلا int) توی رم باشه به عکس زیر دقت کنید:

طبق عکس بالا ما نتیجه میگریم که پوینتر (0x7fff5694dc58) چون از نوع int هستش میاد میگه که مکان (0x7fff5694dc58) به اندازه ۴ بایت (در اکثر سیستم عامل ها متغیر int چهار بایت است) بعدیش مال منه

حالا میخوایم برای اشاره گرمون یا همون 0x7fff5694dc58 یه نامی اختصاص بدیم به این صورت این کار رو میکنیم (ما با زبان C پیش میریم) که به چهار شکل میتونیم انجام بدیم (البته شکل اول قابل فهم تره) و مهم اینه که اون ستاره بین نوع و نام پوینتر باشه مثلا میخونیم [اینت استاره a] که یعنی من یه پوینتر(آدرس هگز) از نوع integer با نام a ساختم تصویر زیر رو ببینید:

خب پس با نحوه تعریف پوینتر آشنا شدیم البته پوینتر برای انواع متغیر های دیگه هم داریم که توی عکس زیر میبینیم :

خط ۵ به ما میگه که یدونه پوینتر ساختم از نوع int با نام a

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

خط ۷ هم مشابه دابل ولی چهار بایت رو درگیر میکنه

خط ۸ تنها تفاوتی که داره اینه که ۱ بایت رو درگیر میکنه یعنی اینجوری

خب امیدوارم که کامل متوجه شده باشید

پوینتر هایی که به نوع خاصی اشاره نمیکنن دیگه چیه ؟ ? (خدایا بسه دیگه)

چرا سخت میکنی داستانو برا خودت

یعنی این که یه آدرس روی رم در نظر بگیریم که به نوع خاصی اشاره نکنه که اسم این پوینتر رو گذاشتن void که میخونیم [ووید پوینتر] یعنی اینجوری

اینجوری هم تعریفش میکنیم

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


خب اوکی فهمیدیم چیه حالا برامون بگو چجوری مقدار دهیش میکنی ؟

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

اوکی شد ؟

توی زبان C و سی پلاس پلاس مدیریت حافظه دست ماست یعنی مثل پایتون یا php یا جاوا و … نیستن ، توی C میتونیم حافظه رم رو قشنگ لمس کنیم پس فهمیدیم متغیر ها توی رم لود میشن و از طرفی زبان C به ما اجازه دسترسی به رم رو میده

اوکیه ؟

زبان C از طریق & پشت نام متغیر میتونه مقدار آدرس هگز نقطه شروع اون متغیر رو بگیره و چون هگزه باید توی یه متغیر از نوع هگز و نوع متغیرمون ( آفرین پوینتر ) بریزیمش اینجوری

توی کد C اینجوری خواهد بود مثلا برای تعریف یه پوینتر به نوع عدد صحیح و تعریف و ریختن آدرس باید آغازین عدد در پوینتر

برای نمایش مقدار هگز (مثلا پوینتر) با تابع printf باید از x% استفاده کنیم

انشاالله که متوجه شدید دیگه پس دیدید که چقد پوینتر آسونه ?

پوینتر NULL چیه؟

یعنی به جای خاصی اشاره نمیکنه ? پوینتر وقتی مقدار 0 برگردونه یعنی به جایی اشاره نمیکنه

الان فک کردین داستان پوینتر رو فهمیدید و تمام؟ خییییر تازه اینجا پوینتر شروع میشه (یاااا اباالفضل ?)


داداش تا اینجا پیش اومدیم یه توضیحی درمورد argc , argv توی پرانتز تابع main توضیح میدی؟

بله حتما ، منظور دوست عزیزمون اینه

1int main(int argc, char *argv[])

اینجا یه توضیحی داده ولی منم یه توضیحی میدم

https://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean

What does int argc, char *argv[] mean?
What does int argc, char *argv[] mean?
In many C++ IDE’s and compilers, when it generates the main function for you, it looks like this:

int main(int argc, char *argv[])
When I code C++ without an IDE, just with a command line compile…

ببین این ها برای دریافت ورودی از کامند لاین استفاده میشن که argc به معنای تعداد پارامتر ورودی هستن و argv اون پارامتر های کامند لاین رو در بر میگیره توی پایتون هم داریمش توی ماژول sys هستش و توی پایتون اینجوریه

چون هر خط پایتون معادل 1000 خط C هستش ? و همونطوری که میدونید زبان پایتون رو با کمک زبان C نوشتن که اینجا سورس کد پایتون موجوده بنابر این ما دیگه دغدغه argc یعنی تعداد ورودی هارو نداریم و خود پایتون برامون هندل میکنه.

همون طوری که دیدید خانه اول لیست بالا نام اسکریپتمونه توی C هم دقیقا همینجوره

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

بگذریم بریم سر اصل مطلب چرا این سوالو مطرح کردم ؟ چون میخواستم چشمت بخوره به عبارت

1char *argv[]

و کنجکاو بشی این چیه ? وقتشه که بریم رابطه ی پوینتر ها و ارایه هارو بفهمیم


خود آرایه در زبان C یک پوینتر است ! ?

ما توی زبان C سوار بر حافظه هستیم و عشق میکنیم ? چی گفتم

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

راه حل نوب ها برای چاپ یک آرایه
راه حل نوب ها برای چاپ یک آرایه

سایز تی (size_t) چیز عجیبی نیست یه چیزی مثل همون int

حالا روش حرفه ای ها

***عکس مهم***
***عکس مهم***

شروع کنیم به بررسی این کد و نکاتشو یاد بگیریم (بررسی نکات ****عکس مهم ****?)

نکته اول : توی زبان C وقتی آرایه رو بدون مقدار درون کروشه مقدار دهی کنیم دیگه نیازی نیست که بشینیم تعدادشونو بشماریم و توی کروشه بنویسیم و با کمک پوینتر میتونیم تعداد اعضاشو بدست بیاریم. (جل الخالق)

نکته دوم : با کمک sizeof میتونیم اندازه یه چیزی توی رم رو به بایت اندازه بگیریم مثلا من اگه بزنم(a)sizeof میاد به من تعداد کل بایت هایی که اون ارایه توی رم درگیر کرده رو میده.

نکته سوم : نام آرایه (که اینجا همون a) در واقع یک پوینتر است.

نکته چهارم : اگه پشت یه پوینتر * بذاریم میاد مقدار به ما میده اینجوری : (توی تعریف پوینتر استثناست)

یا به این کد دقت کنید

نکته پنجم : با تقسیم اندازه کل حافظه اشغالی آرایه ( (a)sizeof )به اندازه مقدار خانه اول آرایه (a*) میشه تعداد اعضای کل آرایه رو بدست آورد به تصویر زیر دقت کن تا متوجه بشی

نکته ششم : وقتی میایم پوینتر رو با یه عدد جمع میکنیم اون میاد بر اساس جنسی که داره روی رم حرکت میکنه مثلا اگه پوینترمون از نوع عدد صحیح باشه وقتی بیایم پوینتر رو یکی بهش اضافه کینم میاد ۴ بایت ۴ بایت قدم میزنه رو RAM به خط 11 عکس مهم دقت کنید اینجا هر دور حلقه for میاد به اندازه i تا اضافه میکنه به پوینتر و همشون رو توی یه پرانتز میذاره و یه * (که اینجا به منظور بدرت آوردن مقداره استفاده میکنه) میذاره پشت اون پرانتز و مقدار int خونه س i ام رو بدست میاره و این روند تا تعداد اعضای آرایه باید ادامه پیدا کنه. به این عکس دقت کنید

خب حالا وقته تمرینه شروع کن و انواع ساختمان های داده رو با زبان C پیاده سازی کن تا کامل مسلط بشی

بازم بگم پوینتر هنوز هم تموم نشده داستانش و خیلی گستردست

توی پست بعدی در مورد struct ها توضیح میدم اونها هم پوینتر هستن ???

این سری ادامه دارد این پست رو لطفا share کنید تا دیگه نشنوم کسی به C بد و بیراه بگه

نظراتتونو برام بنویسید هر مشکلی دارید همینجا بپرسید یا کدتون رو توی gist به اشتراک بذارید و توی کامنت ها بنویسید تا با کمک هم بیشتر یاد بگیریم

فعلا خسته نباشید بزودی با پست جدید میبینمتون

نویسنده مطلب: Ali Gholami

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

با هر سطحی از دانش در سریع‌ترین زمان با آموزش گام به گام، سرمایه گذاری را تجربه کن. همین الان میتونی با لینک زیر ثبت نام کنی و ۱۰ درصد تخفیف در کارمزد معاملاتی داشته باشی

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.