گفتیم اگر متغیری آدرس متغیر دیگری را در خود نگه دارد آن را اشاره‌گر نامند. حال اگر متغیر دوم نیز از نوع اشاره‌گر باشد، متغیر اول اشاره‌گر به اشاره‌گر است. چنین موقعیتی را اشاره‌گر به اشاره‌گر نامند. ممکن است تصور و فهم اشاره‌گر به اشاره‌گر ایجاد اشکال کند. شکل ۸ـ۴ مفهوم اشاره‌گر به متغیر عادی و اشاره‌گر به اشاره‌گر را روشن می‌کند.

ccds

همان طور که ملاحظه می‌کنید، مقدار اشاره‌گر معمولی، آدرس متغیر است اما در مورد اشاره‌گر به اشاره‌گر، اولین اشاره‌گر آدرس اشاره‌گر دوم را دارد که آن هم به نوبه خود آدرس متغیر دیگری را در خود دارد. این روش می‌تواند (به‌صورت تودرتو) تا هرچند بار که نیاز باشد، تکرار گردد. اما در عمل کمتر به بیش از یک بار نیاز پیش می‌آید و داشتن تصور صحیح از آن نیز برای اغلب برنامه‌نویسان مشکل است.
برای توصیف متغیرهایی از نوع اشاره‌گر به اشاره‌گر باید دو ستاره در جلوی آن قرار داد. برای مثال توصیف زیر به کامپایلر می‌گوید که متغیر z اشاره‌گر به اشاره‌گری از نوع float است.
float **z ;
به هرحال باید توجه داشته باشید که z اشاره‌گری به یک مقدار اعشار نیست، بلکه اشاره‌گری به اشاره‌گر است که اشاره‌گر دوم می‌تواند آدرس متغیری از نوع float را داشته باشد.
برای دستیابی به مقدار متغیر هدف، که آدرس آن در اشاره‌گر دوم است، باید اپراتور ستاره را دوباره به کار ببرید، مانند مثال زیر.
# include <stdio.h>
main ()
{
int x , *p , **q ;
x = 10 ;
p = &x ;
q = &p ;
printf (“%d” , **q) ; / * print the value of x */
}
در این مثال، p اشاره‌گر به متغیر int و q نیز اشاره‌گری به اشاره‌گر توصیف شده است که ممکن است آدرس متغیری از نوع int را داشته باشد. حال نتیجه اجرای printf این خواهد شد که ۱۰ (مقدار متغیر x) روی صفحه نمایش نشان داده شود.
یادآوری. آرایه‌ای از اشاره‌گرها نوعی از اشاره‌گر به اشاره‌گر است.