سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ محمد حیدری
سوال در مورد pointer to pointer
جامعه گولنگ ایجاد شده در ۲۵ تیر ۱۴۰۲

سلام

توی اسلاید دقیقه ۹:۵۵، ریترن تایپ متد find برابر [T]leaf** هستش. من سرچ کردم گفته بود این پوینتری‌به پویتنر هستش، یکم در موردش خوندم ولی زیاد خوب متوجهش نشدم. ممنون میشم اگه یکم در مورد ‘پوینتری به پوینتر’ توضیح بدید و بگید که چرا متد find این نوع تایپ رو return میکنه.

سلام

قبل اینکه راجع به این مسأله توضیح بدم راجع به Pointer to pointer یه توضیحاتی باید بدم

هر خونه حافظه ممکنه حاوی یک مقدار باشه که یکی از اون انواع مقدار اشاره گر یا آدرس یک خونه حافظه هستش.

فرض کنیم از ۱۰۰ تا ۱۱۵ خونه‌های حافظه ست

1451-Screenshot from 2023-07-23 20-23-23.png

از سمت چپ متغیری به اسم b داریم که مقدار رضا رو داره و آدرسش میشه ۱۰۱.

حالا طبق مفاهیمی که در بخش اشاره گر یاد گرفتیم میتونیم (&b) آدرس b رو بریزیم توی یک متغیر دیگه به این شکل:

j:= &b , j => &101 , *j => 'reza' // 1 dereference

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

n:= &j , n => &109 , *n => &101 , **n => 'reza' // 2 dereference

حالا فرض کن یک متغیر دیگه داریم به نام n که درون خودش آدرس j رو نگهداری میکنه در واقع به آدرسی اشاره میکنه که محتوای اون آدرس خودش حاوی یک آدرس دیگه ست. در این حالت بهش میگیم Pointer to pointer

حالا بریم کاردبردشو در همین ساختار درختی ببینیم

در ساختارBinary tree که معرفی کردیم درخت با یه برگ ریشه یا همون root شروع میشه که نوع متغیر root از جنس یک اشاره گر به Leaf یا برگ هستش

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

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

حالا میرسیم به تابع جستجو:

0dbf-Screenshot from 2023-07-23 20-58-12 (1).png

این متد که برای ساختار (*Tree) هستش یک مقدار از ورودی دریافت میکنه

برای پیدا کردن نتیجه از root شروع به جستجو میکنه. متغیر root از جنس*Leaf هستش

وقتی به این خط میرسه نوع pl مشخص میشه : اشاره گری به یک اشاره گر

pl := &bt.root

علتش اینه که متغیر bt خودش اشاره گره و وقتی ما مینویسیم &bt در واقع آدرس اون اشاره گر رو میگیریم که میشه اشاره گر به اشاره گر

به عنوان یه تمرین میتونی به این فکر کنی آیا این تابع رو میشه طوری بنویسیم که به جای نوع **Leaf نوع *Leaf برگردونه

بهترین پاسخ
حامد نعیمایی ۰۱ مرداد ۱۴۰۲، ۱۸:۱۵

سلام استاد

ممنون از توضیحات کامل و عالیتون

محمد حیدری ۰۲ مرداد ۱۴۰۲، ۱۵:۴۴

محمد جان جهت تشکر در آکادمی بهتر هست پاسخ رو تایید کنید تا تاپیک بسته بشه

ممنون ازتون

پوریا شفیعی ۰۲ مرداد ۱۴۰۲، ۱۸:۳۸