на указатель. Зачем тут два уровня косвенности?
Иногда из функции нужно вернуть указатель, но возвращать его через return неудобно.Рассмотрим функцию array_min, которая находит адрес минимального числа в массиве.
// min -- адрес указателя на минимальный элемент в массиве
// функция возвращает 0 если массив пустой
int array_min(int* array, int* limit, int** min) {
if (array >= limit) return 0;
*min = array;
for( int* cur = array + 1;
cur < limit;
cur = cur + 1 )
{
if ( *cur < **min ) {
*min = cur;
}
}
return 1;
}
int main() {
int array[] = {4,29,42,2,3};
int* lmin = NULL;
// только в том месте, где объявлен массив, мы можем вычислить его длину
// sizeof(array) вернет длину в байтах
// sizeof(array[0]) или sizeof(int) -- размер одного элемента
if ( array_min( array,
array + sizeof(array)/sizeof(array[0]),
&lmin ) )
{
printf("Min is: %d\n", *lmin );
}
else
{
printf("Array is empty\n");
}
return 0;
}
Минимальный элемент есть только в непустых массивах, поэтому нам надо предусмотреть две ситуации:
массив пустой, тогда минимума не существует.
массив непустой, тогда вернём минимальный элемент.
Если мы просто будем возвращать минимальный элемент из функции, мы не сможем сигнализировать о том, что массив был пустым. Чтобы передать в вызывающую функцию больше информации, мы будем возвращать только число типа int:
ноль (ложь), если минимума не существует
один (истину), если минимум существует. В том случае нам также необходимо передать в вызывающую функцию указатель на минимальный элемент массива. Тип этого указателя int*. Как это сделать, если возвращаемое значение уже занято?
В примере функция array_min вызывается из функции main. Создадим в ней переменную int* lmin, в которую должен попасть указатель на минимальный элемент массива. Чтобы перезаписать lmin через указатель нужно передать адрес lmin в функцию array_min; адрес lmin имеет тип int**. Отсюда и аргумент array_min: int** min .
Иными словами, int** min это адрес, по которому нужно записать указатель на минимальный элемент массива.
Упражнение. Вам дана функция predicate, чью реализацию вы не знаете; вы можете только её вызывать. Вы знаете, что она принимает число и возвращает 0 или 1. Напишите функцию array_contains, которая найдёт первый элемент в массиве, который удовлетворяет условию predicate. Как и функция array_min из примера, функция array_contains возвращает 1 если элемент найден, 0 если не найден. Кроме того, через указатель int** position она должна вернуть адрес найденного элемента.
Тю, дружище, у тебя limit это адрес верхней границы, т.е. ты идёшь указателем от array до limit (не включая)
Обсуждают сегодня