Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Указатели функций в программировании на C с примерами

Указатели дают большие возможности функциям «C», которые мы ограничены тем, что возвращаем одно значение. Благодаря параметрам-указателям наши функции теперь могут обрабатывать фактические данные, а не копии данных.
Чтобы изменить фактические значения переменных, вызывающий оператор передает адреса параметрам-указателям в функции.
В этом случае учебник, вы узнаете-

Пример указателей функций

Например, следующая программа меняет местами два значения из двух:

06

Вывод:

15 

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

  1. Мы объявляем функцию, отвечающую за обмен значениями двух переменных, которая принимает в качестве параметров два целочисленных указателя и возвращает любое значение при вызове.
  2. В основной функции мы объявляем и инициализируем две целочисленные переменные ("m" и "n"), а затем печатаем их значения соответственно.
  3. Мы вызываем функцию swap(), передавая адреса двух переменных в качестве аргументов, используя символ амперсанда. После этого печатаем новые переставленные значения переменных.
  4. Здесь мы определяем содержимое функции swap(), которая принимает адреса двух целочисленных переменных в качестве параметров, и объявляем временную целочисленную переменную, используемую в качестве третьего ящика для хранения, чтобы сохранить одну из переменных-значений, которые будут помещены во вторую переменную.
  5. Сохраните содержимое первой переменной, на которую указывает "а", во временной переменной.
  6. Сохранить вторую переменную, на которую указывает b, в первой переменной, на которую указывает a.
  7. Обновите вторую переменную (обозначенную буквой b) на значение первой переменной, сохраненное во временной переменной.

Функции с параметрами массива

В C мы не можем передать массив по значению в функцию. Принимая во внимание, что имя массива является указателем (адресом), поэтому мы просто передаем имя массива в функцию, что означает передачу указателя на массив.

Например, рассмотрим следующую программу:

23

Вывод:

36

Здесь мы объясним код программы с его деталями

  1. Мы объявляем и определяем функцию add_array(), которая принимает адрес массива (указатель) с номерами его элементов в качестве параметров и возвращает общую накопленную сумму этих элементов. Указатель используется для перебора элементов массива (с использованием нотации p[k]), и мы накапливаем сумму в локальной переменной, которая будет возвращена после перебора всего массива элементов.
  2. Мы объявляем и инициализируем целочисленный массив с пятью целочисленными элементами. Мы печатаем общее суммирование, передавая имя массива (которое действует как адрес) и размер массива в функцию add_array(). вызываемая функция в качестве аргументов.

Функции, возвращающие массив

В C мы можем вернуть указатель на массив, как в следующей программе:

45

Вывод:

53

А здесь мы обсудим детали программы

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

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

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

Поскольку мы знаем по определению, что указатели указывают на адрес в любом месте памяти, они также могут указывать на начало исполняемого кода как на функции в памяти.
Указатель на функцию объявляется с помощью * , общего оператора его объявление:

66

Вы должны помнить, что круглые скобки вокруг (*function_name) важны, потому что без них компилятор будет думать, что function_name возвращает указатель типа return_type.
После определения указателя функции мы должны присвоить его функции. Например, следующая программа объявляет обычную функцию, определяет указатель на функцию, присваивает указатель на обычную функцию и после этого вызывает функцию через указатель:

78

Вывод:

84

  1. Мы определяем и объявляем стандартную функцию, которая печатает текст Hi k раз, указанный параметром times, когда функция вызывается
  2. Мы определяем функцию-указатель (со специальным объявлением), которая принимает целочисленный параметр и ничего не возвращает.
  3. Мы инициализируем нашу функцию указателя функцией Hi_function, что означает, что указатель указывает на функцию Hi_function().
  4. Вместо стандартного вызова функции путем записи имени функции с аргументами, мы вызываем только функцию-указатель, передавая число 3 в качестве аргументов, и все!

Имейте в виду, что имя функции указывает на начальный адрес исполняемого кода, как имя массива, которое указывает на его первый элемент. Таким образом, такие инструкции, как function_ptr =&Hi_function и (*funptr)(3), являются правильными.
ПРИМЕЧАНИЕ. Необязательно вставлять оператор адреса &и оператор косвенности * во время назначения функции и вызова функции.

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

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

94
102

Здесь мы обсуждаем детали программы:

  1. Мы объявляем и определяем четыре функции, которые принимают два целочисленных аргумента и возвращают целочисленное значение. Эти функции складывают, вычитают, умножают и делят два аргумента относительно того, какая функция вызывается пользователем.
  2. Мы объявляем 4 целых числа для обработки операндов, типа операции и результата соответственно. Кроме того, мы объявляем массив из четырех указателей на функции. Каждый указатель функции элемента массива принимает два целочисленных параметра и возвращает целочисленное значение.
  3. Мы назначаем и инициализируем каждый элемент массива уже объявленной функцией. Например, третий элемент, который является указателем третьей функции, будет указывать на функцию операции умножения.
  4. Мы ищем операнды и тип операции от пользователя, набранного с клавиатуры.
  5. Мы вызвали соответствующий элемент массива (указатель функции) с аргументами и сохранили результат, сгенерированный соответствующей функцией.

Инструкция int (*ope[4])(int, int); определяет массив указателей на функции. Каждый элемент массива должен иметь одинаковые параметры и тип возвращаемого значения.
Результат оператора =ope[choice](x, y); запускает соответствующую функцию в соответствии с выбором, сделанным пользователем. Два введенных целых числа являются аргументами, передаваемыми функции.

Функции, использующие указатели void

Пустые указатели используются во время объявлений функций. Мы используем возвращаемый тип void *, который позволяет возвращать любой тип. Если мы предполагаем, что наши параметры не изменяются при передаче функции, мы объявляем ее как константу.
Например:

119

Рассмотрим следующую программу:

124

Результат:

139

Здесь мы обсудим детали программы:

  1. Мы определяем и объявляем функцию, которая возвращает целочисленное значение и принимает адрес неизменяемой переменной без определенного типа данных. Мы вычисляем кубическое значение переменной содержимого (x), на которую указывает указатель num, и, поскольку это пустой указатель, мы должны привести его к целочисленному типу данных с использованием указателя определенной нотации (* datatype), и мы возвращаем значение куба.
  2. Мы объявляем операнд и результирующую переменную. Кроме того, мы инициализируем наш операнд значением «4».
  3. Мы вызываем функцию куба, передавая адрес операнда, и обрабатываем возвращаемое значение в переменной результата

Указатели функций в качестве аргументов

Еще один способ использования указателя функции путем передачи его в качестве аргумента другой функции, иногда называемой «функцией обратного вызова», потому что принимающая функция «вызывает его обратно».
В заголовочном файле 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

Здесь мы обсудим детали программы:

  1. Мы определяем функцию сравнения, состоящую из двух аргументов и возвращающую 0, когда аргументы имеют одинаковое значение, <0, когда arg1 предшествует arg2, и>0, когда arg1 идет после arg2. тип данных массива (целое число)
  2. Мы определяем и инициализируем целочисленный массив. Размер массива хранится в num переменная, а размер каждого элемента массива сохраняется в переменной ширины с помощью предопределенного оператора Си sizeof().
  3. Мы называем qsort функцию и передать имя массива, размер, ширину и функцию сравнения, определенные ранее пользователем, чтобы отсортировать наш массив в порядке возрастания. Сравнение будет выполняться путем взятия на каждой итерации двух элементов массива, пока весь массив не будет отсортирован.
  4. Мы печатаем элементы массива, чтобы убедиться, что наш массив хорошо отсортирован, итерируя весь массив с помощью цикла for.

Язык C

  1. Типы пользовательских функций в программировании на C
  2. Цикл C++ do…while с примерами
  3. Указатели C++ с примерами
  4. Перегрузка оператора C++ с примерами
  5. Функции C++ с примерами программ
  6. Учебное пособие по коллекциям C# с примерами
  7. Указатели в C:что такое указатели в программировании на C? Типы
  8. Количество строк Python() с ПРИМЕРАМИ
  9. Лямбда-функции Python с ПРИМЕРАМИ
  10. Функция Python round() с ПРИМЕРАМИ