169 похожих чатов

Теперь мы увидим типичную ситуацию, при которой функция принимает указатель

на указатель. Зачем тут два уровня косвенности?

Иногда из функции нужно вернуть указатель, но возвращать его через 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 она должна вернуть адрес найденного элемента.

1 ответов

27 просмотров

Тю, дружище, у тебя limit это адрес верхней границы, т.е. ты идёшь указателем от array до limit (не включая)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта