void f(int *ip)
{
static int dummy = 5;
ip = &dummy;
}הקריאה נעשית ככה:
int *ip;
f(ip);
הפונקציה מקבלת כתובת של int
אבל אנחנו מוסרים לה בכלל מצביע לint, כלומר משתנה שמכיל את הכתובת של int
הבעיה היא שפרמטרים בc תמיד מועברים לפי ערך (העתק של התוכן של המשתנה), כן גם מצביעים (אנחנו מעבירים עותק של הכתובת של המצביע)
תשים לב שמה שבעצם עשינו זה שמסרנו לפונקציה f את הכתובת שip החיצוני מכיל (הוא קיבל כתובת אקראית כלשהי כי לא אתחלנו אותו)
הפונקציה לוקחת את הip הפנימי שלה ושמה בו את הכתובת של dummy
אבל בסוף הפונקציה ip הפנימי מת, ואיתו הכתובת שהוא הכיל (הכתובת של dummy)
אם אתה רוצה לשנות את ip החיצוני, אתה צריך להעביר את הכתובת של ip החיצוני לפונקציה, ורק אז היא תוכל לשנות אותו, כי זה מה שאפשר לעשות עם פוינטרים!
מצד אחד ip הוא מצביע בעצמו, אבל אנחנו רוצים לשנות אותו בתוך הפונקציה (שמקבלת רק עותק של הערך שמעבירים אליה), אז הפונקציה צריכה לקבל מצביע למצביע
void f(int **ipp)
{
static int dummy = 5;
*ipp = &dummy;
} ...
int *ip;
f(&ip);
עכשיו אנחנו מעבירים לf את הכתובת של ip (כתובת של מצביע), ובתוך הפונקציה אנחנו משתמשים בעותק של הכתובת הזאת כדי לשנות את ip (לשנות את המצביע)
בקיצור, משתמשים במצביע למצביע כעובדים עם מצביעים, ורוצים להעביר אותם לפונקציה שתוכל לשנות אותם.
מקור
http://c-faq.com/ptrs/passptrinit.html