Указатели функций в программировании на C с примерами
Указатели дают большие возможности функциям «C», которые мы ограничены тем, что возвращаем одно значение. Благодаря параметрам-указателям наши функции теперь могут обрабатывать фактические данные, а не копии данных.
Чтобы изменить фактические значения переменных, вызывающий оператор передает адреса параметрам-указателям в функции.
В этом случае учебник, вы узнаете-
- Пример указателей функций
- Функции с параметрами массива
- Функции, возвращающие массив
- Указатели функций
- Массив указателей функций
- Функции, использующие указатели void
- Указатели функций в качестве аргументов
Пример указателей функций
Например, следующая программа меняет местами два значения из двух:
06
Вывод:
15пре>
![]()
Программа меняет местами фактические значения переменных, потому что функция обращается к ним по адресу с помощью указателей. Здесь мы обсудим процесс программы:
- Мы объявляем функцию, отвечающую за обмен значениями двух переменных, которая принимает в качестве параметров два целочисленных указателя и возвращает любое значение при вызове.
- В основной функции мы объявляем и инициализируем две целочисленные переменные ("m" и "n"), а затем печатаем их значения соответственно.
- Мы вызываем функцию swap(), передавая адреса двух переменных в качестве аргументов, используя символ амперсанда. После этого печатаем новые переставленные значения переменных.
- Здесь мы определяем содержимое функции swap(), которая принимает адреса двух целочисленных переменных в качестве параметров, и объявляем временную целочисленную переменную, используемую в качестве третьего ящика для хранения, чтобы сохранить одну из переменных-значений, которые будут помещены во вторую переменную.ли>
- Сохраните содержимое первой переменной, на которую указывает "а", во временной переменной.
- Сохранить вторую переменную, на которую указывает b, в первой переменной, на которую указывает a.
- Обновите вторую переменную (обозначенную буквой b) на значение первой переменной, сохраненное во временной переменной.
Функции с параметрами массива
В C мы не можем передать массив по значению в функцию. Принимая во внимание, что имя массива является указателем (адресом), поэтому мы просто передаем имя массива в функцию, что означает передачу указателя на массив.
Например, рассмотрим следующую программу:
23Вывод:
36Здесь мы объясним код программы с его деталями
![]()
- Мы объявляем и определяем функцию add_array(), которая принимает адрес массива (указатель) с номерами его элементов в качестве параметров и возвращает общую накопленную сумму этих элементов. Указатель используется для перебора элементов массива (с использованием нотации p[k]), и мы накапливаем сумму в локальной переменной, которая будет возвращена после перебора всего массива элементов.
- Мы объявляем и инициализируем целочисленный массив с пятью целочисленными элементами. Мы печатаем общее суммирование, передавая имя массива (которое действует как адрес) и размер массива в функцию add_array(). вызываемая функция в качестве аргументов.
Функции, возвращающие массив
В C мы можем вернуть указатель на массив, как в следующей программе:
45Вывод:
53А здесь мы обсудим детали программы
![]()
- Мы определяем и объявляем функцию, которая возвращает адрес массива, содержащий целочисленное значение, и не принимает никаких аргументов.
- Мы объявляем целочисленный указатель, который получает полный массив, построенный после вызова функции, и мы печатаем его содержимое, перебирая весь массив из пяти элементов.
Обратите внимание, что для хранения адреса массива, возвращаемого функцией, определен указатель, а не массив. Также обратите внимание, что когда локальная переменная возвращается из функции, мы должны объявить ее статической в функции.
Указатели функций
Поскольку мы знаем по определению, что указатели указывают на адрес в любом месте памяти, они также могут указывать на начало исполняемого кода как на функции в памяти.
Указатель на функцию объявляется с помощью * , общего оператора его объявление:66Вы должны помнить, что круглые скобки вокруг (*function_name) важны, потому что без них компилятор будет думать, что function_name возвращает указатель типа return_type.
После определения указателя функции мы должны присвоить его функции. Например, следующая программа объявляет обычную функцию, определяет указатель на функцию, присваивает указатель на обычную функцию и после этого вызывает функцию через указатель:78Вывод:
84
![]()
- Мы определяем и объявляем стандартную функцию, которая печатает текст Hi k раз, указанный параметром times, когда функция вызывается
- Мы определяем функцию-указатель (со специальным объявлением), которая принимает целочисленный параметр и ничего не возвращает.
- Мы инициализируем нашу функцию указателя функцией Hi_function, что означает, что указатель указывает на функцию Hi_function().
- Вместо стандартного вызова функции путем записи имени функции с аргументами, мы вызываем только функцию-указатель, передавая число 3 в качестве аргументов, и все!
Имейте в виду, что имя функции указывает на начальный адрес исполняемого кода, как имя массива, которое указывает на его первый элемент. Таким образом, такие инструкции, как function_ptr =&Hi_function и (*funptr)(3), являются правильными.
ПРИМЕЧАНИЕ. Необязательно вставлять оператор адреса &и оператор косвенности * во время назначения функции и вызова функции.Массив указателей функций
Массив указателей на функции может играть роль переключателя или оператора if для принятия решения, как в следующей программе:
94102Здесь мы обсуждаем детали программы:
![]()
- Мы объявляем и определяем четыре функции, которые принимают два целочисленных аргумента и возвращают целочисленное значение. Эти функции складывают, вычитают, умножают и делят два аргумента относительно того, какая функция вызывается пользователем.
- Мы объявляем 4 целых числа для обработки операндов, типа операции и результата соответственно. Кроме того, мы объявляем массив из четырех указателей на функции. Каждый указатель функции элемента массива принимает два целочисленных параметра и возвращает целочисленное значение.
- Мы назначаем и инициализируем каждый элемент массива уже объявленной функцией. Например, третий элемент, который является указателем третьей функции, будет указывать на функцию операции умножения.
- Мы ищем операнды и тип операции от пользователя, набранного с клавиатуры.
- Мы вызвали соответствующий элемент массива (указатель функции) с аргументами и сохранили результат, сгенерированный соответствующей функцией.
Инструкция int (*ope[4])(int, int); определяет массив указателей на функции. Каждый элемент массива должен иметь одинаковые параметры и тип возвращаемого значения.
Результат оператора =ope[choice](x, y); запускает соответствующую функцию в соответствии с выбором, сделанным пользователем. Два введенных целых числа являются аргументами, передаваемыми функции.Функции, использующие указатели void
Пустые указатели используются во время объявлений функций. Мы используем возвращаемый тип void *, который позволяет возвращать любой тип. Если мы предполагаем, что наши параметры не изменяются при передаче функции, мы объявляем ее как константу.
Например:119Рассмотрим следующую программу:
124Результат:
139Здесь мы обсудим детали программы:
![]()
- Мы определяем и объявляем функцию, которая возвращает целочисленное значение и принимает адрес неизменяемой переменной без определенного типа данных. Мы вычисляем кубическое значение переменной содержимого (x), на которую указывает указатель num, и, поскольку это пустой указатель, мы должны привести его к целочисленному типу данных с использованием указателя определенной нотации (* datatype), и мы возвращаем значение куба.
- Мы объявляем операнд и результирующую переменную. Кроме того, мы инициализируем наш операнд значением «4».
- Мы вызываем функцию куба, передавая адрес операнда, и обрабатываем возвращаемое значение в переменной результата
Указатели функций в качестве аргументов
Еще один способ использования указателя функции путем передачи его в качестве аргумента другой функции, иногда называемой «функцией обратного вызова», потому что принимающая функция «вызывает его обратно».
В заголовочном файле stdlib.h функция Quicksort «qsort() ” использует этот метод, который представляет собой алгоритм, предназначенный для сортировки массива.141
- void *base :недействительный указатель на массив.
- size_t num :номер элемента массива.
- size_t ширина Размер элемента.
- int (*compare (const void *, const void *) :указатель на функцию, состоящий из двух аргументов и возвращающий 0, когда аргументы имеют одинаковое значение, <0, когда arg1 предшествует arg2, и>0, когда arg1 стоит после arg2 .
Следующая программа сортирует массив целых чисел от меньшего к большему с помощью функции qsort():
154
Результат:
160
Здесь мы обсудим детали программы:
- Мы определяем функцию сравнения, состоящую из двух аргументов и возвращающую 0, когда аргументы имеют одинаковое значение, <0, когда arg1 предшествует arg2, и>0, когда arg1 идет после arg2. тип данных массива (целое число)
- Мы определяем и инициализируем целочисленный массив. Размер массива хранится в num переменная, а размер каждого элемента массива сохраняется в переменной ширины с помощью предопределенного оператора Си sizeof().
- Мы называем qsort функцию и передать имя массива, размер, ширину и функцию сравнения, определенные ранее пользователем, чтобы отсортировать наш массив в порядке возрастания. Сравнение будет выполняться путем взятия на каждой итерации двух элементов массива, пока весь массив не будет отсортирован.
- Мы печатаем элементы массива, чтобы убедиться, что наш массив хорошо отсортирован, итерируя весь массив с помощью цикла for.
Язык C
- Типы пользовательских функций в программировании на C
- Цикл C++ do…while с примерами
- Указатели C++ с примерами
- Перегрузка оператора C++ с примерами
- Функции C++ с примерами программ
- Учебное пособие по коллекциям C# с примерами
- Указатели в C:что такое указатели в программировании на C? Типы
- Количество строк Python() с ПРИМЕРАМИ
- Лямбда-функции Python с ПРИМЕРАМИ
- Функция Python round() с ПРИМЕРАМИ