پوینتر به پوینتر (Pointer to Pointer)
اینجا درباره «پوینتر به پوینتر (Pointer to Pointer)» حرف می زنیم. «پوینتر (Pointer)» آدرس یک متغیر را نگه می دارد. «پوینتر به پوینتر» آدرس آن پوینتر را نگه می دارد. یعنی یک لایه فاصله بیشتر است. برای مرور بعدی، صفحه پوینتر به پوینتر را ذخیره کن.
تعریف سادهِ پوینتر به پوینتر
مثل یک برگه آدرس روی برگه دیگر فکر کن. برگه اول آدرس متغیر است. برگه دوم آدرس برگه اول است. پس با دو ستاره (**) به مقدار اصلی می رسیم.
int myNum = 10;
int *ptr = &myNum;
int **pptr = &ptr;
printf("myNum = %d\n", myNum);
printf("*ptr = %d\n", *ptr);
printf("**pptr = %d\n", **pptr);
نکته: *ptr مقدارِ متغیر را می دهد. **pptr همان مقدار را از دو لایه می دهد.
تغییر مقدار با پوینتر به پوینتر
چون **pptr به متغیر می رسد، می توانی مقدار را تغییر دهی. این تغییر مستقیم در متغیر دیده می شود.
int myNum = 5;
int *ptr = &myNum;
int **pptr = &ptr;
**pptr = 20;
printf("myNum = %d\n", myNum);
مسیر آدرس ها مرحله به مرحله
- myNum یک مقدار نگه می دارد؛ مثلا 10.
- ptr آدرس myNum را نگه می دارد.
- pptr آدرس ptr را نگه می دارد.
- *ptr مقدار myNum را برمی گرداند.
- **pptr همان مقدار را از دو لایه می دهد.
کاربردها و احتیاط ها
- کاربرد در ارسال «پوینتر به تابع» و ساختارهای پیچیده.
- ابتدا مقداردهی کن؛ پوینترِ تهی خطرناک است.
- ساختار آدرس ها را آرام بررسی کن.
برای پایه قبلی، به حساب پوینتر برو. برای ادامه مسیر، سری به توابع در C بزن.
جمع بندی سریع
- پوینتر به پوینتر یعنی آدرس یک پوینتر.
- *ptr به مقدار می رسد؛ **pptr هم همان مقدار است.
- می توانی با **pptr مقدار را تغییر دهی.
- قبلِ استفاده، همه آدرس ها معتبر باشند.