Функция возвращает указатель c

Функция возвращает указатель c

Хотя функции, возвращающие указатели, обрабатываются точно так же, как и функции с другим типом, следует рассмотреть несколько важных понятий.

Указатели на переменные — это не целые числа и не беззнаковые целые. Это адрес памяти некоторого типа данных. Причина такого разделения состоит в том, что когда выполняются арифметические действия с указателем, изменения происходят с учетом базового типа, то есть, если указатель на целое увеличивается, он будет содержать значение на 2 больше по сравнению с предыдущим (предполагается использование 2-байтных целых). Каждый раз при увеличении указателя он указывает на следующий элемент базового типа. Поскольку каждый тип данных может иметь различную длину, компилятор должен знать, на какой тип данных указывает указатель, чтобы правильно осуществить переход к следующему элементу данных.

Ниже показана функция, возвращающая указатель на строку в месте, где найдено соответствие символов:

char *match(char с, char *s)
<
register int count;
count = 0;
while(c!=s[count] && s[count]) count++;
return(&s[count]);
>

Функция match() пытается вернуть указатель на позицию в строке, где первый раз найден символ с. Если не найдено соответствие, возвращается указатель, содержащий NULL. Ниже показана небольшая программа, использующая match():

char *match(char c*, char *s);

int main(void)
<
char s[80], *p, ch;
gets (s) ;
ch = getche();
p = match(ch, s);
if (p) /* совпадение */
printf("%s ", p);
else
printf("No match found.");
return 0;
>

Данная программа осуществляет чтение строки, а затем символа. Если символ содержится в строке, то выводится строка, начиная с момента совпадения. Иначе выводится «No match found».

3 EFiore [2017-10-14 23:49:00]

Я новичок в C, и мне трудно найти все эти указатели. Другими словами, оператор разыменования и оператор амперсанда. Я верю, что, глядя на них какое-то время, я начинаю понимать, как они работают. Например:

Я уверен, что понимаю, как это работает.
Я читаю "Язык программирования C" Кернигана и Ричи, но меня смущает их код, который у них есть в разделе 5.4 (адресная арифметика). Я должен указать, что я понимаю адресную арифметику, поэтому мой вопрос не относится к этому. И мой вопрос о коде внутри функции ниже. Поиск в Интернете вопросов об этом коде генерирует много сообщений, в которых люди не понимают, как работает код в операторе if/else. В любом случае, мой вопрос касается собственно имени функции.

Опять же, я понимаю код в функции, но как

работать? Я понимаю, что эта функция возвращает указатель. Означает ли это, что, указав имя функции в качестве указателя, мы возвращаем указатель на тип char? Если да, то на что это указывает? В моем предыдущем примере мы имеем

Читайте также:  Как удалить всю музыку из вк разом

Здесь переменная "указатель" указывает на переменную x. Однако. в функции alloc не указывает ни на что. Любая помощь будет оценена.

c function pointers

3 ответа

2 Ryan [2017-10-15 00:25:00]

вернет указатель на символ

Может быть проще понять, написано ли это так:

Теперь, что на самом деле указывает указатель. Ранее на этой строке

a char создается массив размером 1000. У нас есть массив из 1000 символов, а имя allocbuf указывает на первый элемент в массиве. Далее, на этой строке;

Мы создаем указатель (allocp) для первого элемента массива 1000 char (allocbuf). Оба массива и указатель являются глобальными переменными. Они могут быть доступны в любом месте программы. В приведенном примере эти переменные будут использоваться в функции alloc.

Прежде чем продолжить, было бы целесообразно определить, какова цель функции. Цель состоит в том, чтобы использовать ранее определенный 1000 char массив (это может помочь вам подумать о char как один байт) для выделения памяти. Таким образом, функция будет отслеживать, какая память была использована. И верните указатель на блок размера n, который можно использовать (или null ‘0, если памяти недостаточно).

Не следует беспокоиться о том, как освобождается память в этом примере. Я перечитываю раздел, из которого вы вытащили этот пример, и позже определяет метод, называемый "afree", чтобы освободить память, выделенную этой функцией.

Функция отслеживает память, которая была использована путем увеличения ‘allocp (указатель на массив из 1000 символов) на’ n (запрошенный размер) каждый раз, когда запрашивается память. Затем, когда пользователь функции запрашивает больше памяти, он проверяет, может ли выполняться запрос этими строками;

если запрашиваемый размер не подходит, возвращается null. Функция использует текущую позицию ‘allocp, чтобы определить, осталось ли достаточно памяти от предыдущих вызовов. Если запрошенный размер подходит, то это происходит;

Что это значит, это increment ‘allocp, но сколько бы памяти не было запрошено. Этот указатель используется для отслеживания того, сколько памяти было запрошено этой функцией. Поскольку функция может выполнять запрос памяти, теперь она считает, что запрошенная память используется. Таким образом, указатель теперь указывает на первый char в массиве 1000 char, который не используется. Затем, после увеличения указателя, функция возвращает указатель на первый char блока памяти, запрошенный путем вычитания ‘n (запрошенный размер) из текущей позиции’ allocp.

Во всем этом никто не знает, какова ценность этой памяти. Никто не знает, что содержит allocbuf [13] или allocbuf [314]. Эта функция управляет только тем, какая память свободна и что взято, ей не важно, что на самом деле хранится в памяти.

Читайте также:  Ростелеком мобильная связь отзывы клиентов

Если пользователь запрашивает 4 байта, например:

хранит 32-битный int в нем так:

тогда первые четыре элемента allocbuf содержат это целое число. Если вы освободите память,

тогда указатели все еще работают, и первые 4 элемента allocbuf содержат это целое число. Ничто не изменило значение этих байтов. Если вы снова запросите память, однако

Затем alloc вернет ТОЛЬКО 4 БАЙТА К ‘4bytesAgain, ТО, ЧТО ЭТО ВОЗВРАЩАЕТСЯ В’ 4bytes! Поскольку память была освобождена, функция "alloc" не может ее повторно использовать. Итак, если вы теперь заполняете эти четыре байта, скажем, именем;

то это изменит значения, на которые указывают оригинальные "4 байта" и "4 байта".

0 atru [2017-10-14 23:58:00]

char *alloc(int n) означает, что alloc — это функция, которая возвращает указатель на char. В этом случае это указатель на первый элемент массива, который представляет блок памяти, зарезервированный на alloc . Помещение * рядом с alloc может немного ввести в заблуждение, подумайте об этом больше как char* alloc(int n) .

Имя функции не является указателем, то, что оно возвращает, — так же, как вы пишете int fun(int x) — за исключением того, что здесь возвращаемое значение не int , а char * .

Это просто означает, что всякий раз, когда вызывается функция, он возвращает указатель на char .

Например, когда вызывается эта функция, вы можете увидеть что-то вроде этого:

Указатели на функции

К ак уже обсуждалось ранее функции – это набор команд, которые расположены в соответствующей области памяти. Вызов функции – это сохранение состояния, передача аргументов и переход по адресу, где располагается функция. В си есть возможность создавать указатели на функции. Указатели на функции позволяют упростить решение многих задач. Совместно с void указателями можно создавать функции общего назначения (например, сортировки и поиска). Указатели позволяют создавать функции высших порядков (функции, принимающие в качестве аргументов функции): отображение, свёртки, фильтры и пр. Указатели на функции позволяют уменьшать цикломатическую сложность программ, создавать легко масштабируемые конструкции. Рассмотрим пример. Создадим функцию и указатель на эту функцию

Синтаксис объявления указателей на функцию
(* )( );

В этом примере мы создали функцию отображения, которая применяет ко всем элементам массива функцию, которая передаётся ей в качестве аргумента. Когда мы вызываем функцию map, достаточно просто передавать имена функций (они подменяются указателями). Запишем теперь функцию map, которая получает в качестве аргумента массив типа void:

Читайте также:  Клавиатура с тихими клавишами

Вот где нам понадобились указатели типа void. Так как map получает указатель на функцию, то все функции должны иметь одинаковые аргументы и возвращать один и тот же тип. Но аргументы функций должны быть разного типа, поэтому мы делаем их типа void. Функция map получает указатель типа void (*)(void*), поэтому ей теперь можно передавать любую из четырёх функций.
Пример другой функции: функция filter получает указатель на массив и возвращает размер нового массива, оставляя в нём только те элементы, для которых переданный предикат возвращает логическую истину (предикат – функция, которая возвращает истину или ложь). Сначала напишем для массива типа int:

Теперь для массива типа void

Ещё одна функция – свёртка. Она получает в качестве аргументов массив и функцию от двух аргументов. Эта функция действует следующим образом: сначала она применяется к первым двум аргументам, затем она применяется к третьему аргументу и результату предыдущего вызова, затем к четвёртому аргументу и результату предыдущего вызова и т.д. С помощью свёртки можно, например, найти сумму всех элементов массива, максимальный элемент массива, факториал числа и т.п.

Последний пример: функция сортировки вставками для массива типа void. Так как тип массива не известен, то необходимо передавать функцию сравнения.

Массив указателей на функции

М ассив указателей на функции определяется точно также, как и обычный массив – с помощью квадратных скобок после имени:

Точно также можно было создать массив динамически

Часто указатели на функцию становятся громоздкими. Работу с ними можно упростить, если ввести новый тип. Предыдущий пример можно переписать так

Ещё один пример: функция any возвращает 1, если в переданном массиве содержится хотя бы один элемент, удовлетворяющий условию pred и 0 в противном случае.

qsort и bsearch

В библиотеке stdlib си имеется несколько функций, которые получают в качестве аргументов указатели на функции. Функция qsort получает такие же аргументы, как и написанная нами функция insertionSort: массив типа void, размер массива, размер элемента и указатель на функцию сравнения. Давайте посмотрим простой пример — сортировка массива строк:

Функция bsearch проводит бинарный поиск в отсортированном массиве и получает указатель на функцию сравнения, такую же, как и функция qsort. В случае, если элемент найден, то она возвращает указатель на этот элемент, если элемент не найден, то NULL.

Ссылка на основную публикацию
Файлы mdi чем открыть
Если вы не смогли открыть файл двойным нажатием на него, то вам следует скачать и установить одну из программ представленных...
Украли сумку с документами что делать
В связи с угрозой распространения на территории Российской Федерации коронавирусной инфекции приостановлен личный прием граждан в судах. Смотреть как изолируются...
Ультра исо вам необходимо иметь права администратора
Очень многие пользователи, когда им нужно сделать загрузочную флешку Windows или с дистрибутивом другой операционной системы, прибегают к использованию программы...
Файлы mdx чем открыть
MDX - это формат образов дисков, который был создан разработчиками программы DAEMON Tools. Это формат был создан в результате усовершенствования...
Adblock detector