آموزش جامع پوینتر ها در زبان C ( پارت 2 )
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/dsxdjbno3gqb.jpeg)
سلام دوستان من علی هستم امیدوارم پست قبلی رو خونده باشید و تمرین کرده باشید.
توی این پست میخوایم یکم سطح بالاتر و کاربردی تر پوینتر هارو بررسی کنیم
خب ، قبلا دیدیم که چجوری یک متغیر داده رو ذخیره میکنه و دیدیم که چگونه یک آرایه میتونه چند عنصر هم نوع رو توی یک آرایه ذخیره کنه ، حالا گاهی ما نیاز داریم که چند عنصر غیر هم نوع رو تحت یک نام توی حافظه ذخیره کنیم —> توی زبان C به مجموعه ای از متغیر ها میگن ساختمان (struct) که لزوما نوع یکسانی ندارن اون متغیر ها –> اگه شی گرایی C++ کار کرده باشید بحث یکم براتون آسون تر میشه چون یکمی شباهت بینشون وجود داره.
ساختمان ها یجورایی شبیه آبجکت های جاوااسکریپت هم هستن حالا جلوتر بهتر متوجه میشید
خب اگه یادتون باشه از سی پلاس پلاس در تعریف کلاس ها ما باید بعد از کروشه پایانی سمیکالن میذاشتیم اینو یادتون باشه اینجا هم توی تعریف ساختمان (struct) ما باید تهش سمیکالن بذاریم.
یک نمونه ساختمان کد نویسی کنیم
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/fnfdsjcgoxtj.png)
خب من یک مجموعه داده رو گذاشتم کنار هم اسمشونو گذاشتم شخص(person) –> یعنی یک شخص مثلا نام داره فامیلی داره کد ملی داره و سن داره مثلا
حالا ما اومدیم این ساختمان رو ساختیم باید ازش استفاده کنیم چجوری؟باید ازش نمونه بسازیم مشابه شی گرایی توی سی پلاس پلاس یا ..
(یا رابطه ایمیج داکری و کانتینر) –> برو داکر یاد بگیر بدرد میخوره ?
(یا رابطه یک exe با process) –> برو یکم سیستم عامل و اسمبلی یاد بگیر بدرد میخوره ?
(یا رابطه انسان و علیرضا) –> برو یکم فلسفه بخون بدرد میخوره ?
این مفاهیم فلسفی هستن ، کلا مفهوم شی گرایی نفوذ فلسفه به برنامه نویسی و کامپیوتره
اینها فقط مثال بودن منظورم کلا اینه که یک پروتوتایپی طراحی میکنی و سپس ازش نمونه میسازی مثلا خدا انسان رو خلق کرد و هر انسانی که بدنیا میاد یک نمونه از پروتوتایپ انسانه
خب کدش رو بنویسیم
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/mooxvf1n2wtw.png)
خط 13 اومدیم دو نمونه از روی ساختمان person ساختیم به نام person1 و person2 و سپس مشابه جاوااسکریپت با نقطه مقدار دهی میکنیم فقط دقت کنید (خط 13) حتما یاد struct قبلش باشه و سپس نام ساختمانمون و نمونه هایی که مخوایم بسازیم
اگه بخوایم یجا مقدار دهی کنیم نمونه مون رو اینکارو میکنیم ?
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/h3cmysvfj6m8.png)
به خط 13 دقت کنی متوجه میشی داستانو اینجوری مقدار دهی اولیه کردم یه چیزی شبیه آرایه هاست مقدار دهی اولیش
بریم و یکم استفاده از ساختمان هارو ملموس تر کنیم
توی ترمینال لینوکس ما یک توانایی داریم به نام ایجاد alias یعنی میتونی بجای یک کامند خاص خودت یدونه اسم انتخاب کنی ،اینجا توی C هم ما توانایی ایجاد alias داریم چجوری ؟ اینجوری ?
با کمک typedef
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/t1tj64enlxid.png)
اینجا اومدم گفتم بجای این که توی برنامه مدارم بنویسی unsigned char بجاش از aliasش استفاده کن و از BYTE استفاده کن
حالا میتونیم روی ساختمان ها هم این حرکت رو بزنیم چجوری ؟
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/c2a2hzuex3og.png)
این عکس رو با عکس قبل مقایسه کن اینجا یکم زیبا تر و قابل درک تر شد مفهوم
خط 3 تا 9 انگار ما یک کلاسی با نام person ایجاد کردیم و خط 13 یک نمونه از شخص ساختیم و همونجا مقدار دهیش کردیم (کی گفته زبان C شی گرا نیست ??)
الان ما شی person1 رو داریم که اسمش Ali و فامیلش Gh
حالا اینا چه ربطی به پوینتر ها داره ؟
باید بگم که این ها هم مثل آرایه ها و متغیر ها یجایی روی حافظه نشستن دیگه پس با پوینتر میتونیم فراخونیشون کنیم
بریم ببینیم روی حافظه struct چه شکلی میشه اول یدونه sizeof از ساختمان (PERSON) میگیریم :
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/bkpuzxwechx3.png)
داره به ما میگه این ساختمان 24 بایتیه یعنی چی ؟ ببین دوتا int داریم که جمعا میشه 8 بایت و دوتا پوینتر داریم که به نوع کاراکتر اشاره میکنن که اینا هم جمعا 16 بایت میشن (چون سیستمم 64 بیتیه) پس جمعا میشه 24 بایت
به عکس زیر دقت کنید
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/b75ilva54qkd.png)
که دوتای اولی در واقع پوینتر هستن و چون سیستمم 64 بیتیه 8 بایت فضا میخوان و اونام که میدونیم
بریم توی کد C و اینو آزمایش کنیم اول باید یک پوینتر از نوع PERSON بسازیم (این مهم ترین کاربرد پوینتره مثلا توی برنامه نویسی گرافیک مثلا SDL ،توی برنامه نویسی شبکه و سوکت پروگرمینگ با زبانC و قدرت و زیبایی این زبان اینجا آشکار میشه)
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/ssy7npg2h505.png)
به خط ۱۵ کد بالا نگاه کنید اینجا ما یک اشاره گر تعریف کردیم به نام ptr که قراره به نوع داده(ساختمان) PERSON اشاره بکنه و سپس آدرس شروع شی ای که ساختیم رو بریزیم داخلش
حالا بریم ببینیم اینجا چیکار میتونیم بکنیم
مثلا اول بریم با پوینتر و مقدار Ali رو بخونیم ، خود زبان C برای راحتی کار ما یدونه (<-) برامون قرار داده که وقتی جلوی پوینتر بذاریم میتونیم مقدار رو بگیریم (اینجا چون نوع داده ها یکسان نیست پس با عدد نمیتونیم حرکت کنیم و مقادیر بخونیم)
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/utxqgpkjoqg3.png)
روش نقطه ایش هم این شکلی میشه
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/yzjaqjd9v2ht.png)
و یک نکته دیگه هم بگیم و بحث پوینتر یکمی تموم میشه ?
میتونیم یک مجموعه ای از اشیا بسازیم یا به عبارتی تعداد خاصی نمونه از یک struct بسازیم
ببین نگاه کن الان ما داریم میگیم چند شی از PERSON مگه اینا از یک جنس نیستن همشون پس یاد چی میوفتیم –> آرایه (فرض کن توی یک بازی کامپیوتری بیایم و 100 تا سرباز بسازیم)
به کد زیر نگاه کن
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/gp4stqgnvair.png)
اینجا ما 10 سرباز با نام سرباز وطن ایجاد کردیم و خروجی اینجوری شد (مثلا فرض کن سرباز های یک بازی کامپیوتری هستن حالا این یه مثاله مثلا کد ملی رو میتونستیم با استقامت یا قدرت سرباز مثلا جایگزین کنیم)
![](https://files.virgool.io/upload/users/382760/posts/nxzczziigcmh/9txwkxrzmuup.png)
خب بحث پوینتر رو تا حدی که نیاز بود گفتیم ولی بازم میگم خیلی گستردست زبان C و هیچکس نمیتونه ادعا کنه که C رو مسلطه حتی یک شخص با 15 سال تجربه کار با زبان C هم همچین ادعایی شاید نداشته باشه
توی بحث بعدی این سری روی برنامه نویسی شبکه و بحث سوکت پروگرمینگ قراره کار کنیم و از مباحث این ۲ ویرگول توشون استفاده کنیم
امیدوارم لذت برده باشید