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

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

Например разделение числа на целую и дробную часть:
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);
}