Для чего могут быть нужны указатели на указатели в Си?

Есть ли близкие к жизни, а не абстрактные, примеры?.. Желательно как можно более подробно, чтобы даже такому нубу как я можно было понять :)
Регистрируйтесь, делитесь ссылками в соцсетях, получайте на WMR кошелек 20% с каждого денежного зачисления пользователей, пришедших на проект по Вашей ссылке. Подробнее
После регистрации Вы также сможете получать до 150 руб за каждую тысячу уникальных поисковых переходов на Ваш вопрос или ответ Подробнее
ЛУЧШИЙ ОТВЕТ
Мудрец (22005)
Ну, например функция по задумке должна вернуть две и больше переменных.

Например разделение числа на целую и дробную часть:
double modf(double x, double *iptr);
получает x, возвращает дробную часть, целую часть возвращает по указателю.

Еще - передача в функцию массивов по указателю на них.

Не забываем, что Си близок к языкам низкого уровня, а там нужна адресная арифметика. Также с помощью указателей возможны различные "хакерские" приемы программирования.
ЕЩЕ ОТВЕТЫ
Знаток (425)
Это используется, когда надо позволить функции менять адрес, на который указывает указатель. Т.е., проще говоря, менять его. Тогда в эту самую функцию передается указатель на этот указатель. Если бы мы передали просто его самого - внутри функции создалась бы его копия и пришлось бы делать return. А для чего, спрашивается, может понадобиться менять адрес указателя?.. Это пригодится, если, например, он указывает на сложную структуру, а не на число или что-то в этом роде. Пример вот такой:


#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>

struct employee
{
int age;
int salary;
char name[20];
int married:1; // 1 bit
};

typedef struct employee emp; //объявляем алиас для struct employee

/*
сюда и передаем указатель на указатель eldest, т.е. указатель на указатель на СТРУКТУРУ emp.
Фактически, я прошу функцию сделать следующее - поменять мой внешний указатель так, чтобы он указывал на сотрудника с наибольшим возрастом. Для этого я передаю указатель на этот самый указатель.
*/
void get_eldest(emp** eldest,emp* arr_emps) //функция для определения старшего.
{
if (arr_emps[0].age > arr_emps[1].age)
*eldest = arr_emps[0]; //*eldest - т.е. ЗНАЧЕНИЕ, на которое указывает eldest, т.е. адрес структуры
else
*eldest = arr_emps[1];
}


void main(int argc, char* argv[]) //есть 2 сотрудника. Надо определить старшего из них.
{
emp emps[2] = {
{40,4000,"Stanton",1},
{60,6000,"Clinton",1}
};

emp* eldest_emp;

get_eldest(&eldest_emp,&emps); //в первом параметре идет АДРЕС указателя, т.е. указатель на указатель
printf("ELDEST EMP NAME %s AGE %d SAL %d",eldest_emp->name,eldest_emp->age,eldest_emp->salary);
}