Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
HitGirl
10 / 7 / 1
Регистрация: 08.10.2015
Сообщений: 283
Завершенные тесты: 1
1

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

15.10.2017, 10:52. Просмотров 1554. Ответов 11
Метки нет (Все метки)

Здравствуйте!
Подскажите, пожалуйста, почему &f, f и *f возвращают одинаковое число?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int f(int a, int b)
{
    printf("adr a= %i a= %i\n",&a,a);
    printf("adr b= %i b= %i\n",&b,b);
    return a+b;
}
 
int main()
{
    printf("f= %i\n&f= %i\n*f= %i\nf()= %i\n%i\n",f,&f,*f,f(1,2),(*f)(3,4));
    return 0;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2017, 10:52
Ответы с готовыми решениями:

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

Указатель на функцию
Здравствуйте. Необходимо написать функцию, которая находит ноль функции на заданном промежутке...

Указатель на функцию
как сделать указатель типа void на функцию ?

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

Вызвать функцию через указатель
Си Сделать указатель на функцию. И вызвать функцию через указатель. Функция линейного...

11
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
15.10.2017, 11:22 2
f = &f одинаково, то же самое как и с массивами. Имя функции является константным указателем на начало расположения функции в оперативной памяти.
f (1,2) = (*f)(1,2)
Отсюда следует что f = *f
1
HitGirl
10 / 7 / 1
Регистрация: 08.10.2015
Сообщений: 283
Завершенные тесты: 1
15.10.2017, 21:52  [ТС] 3
Цитата Сообщение от Michail97 Посмотреть сообщение
Отсюда следует что f = *f
При компиляции f(1,2) заменится на (*f)(1,2), так же как при обращении к элементам массива заменяются квадратные скобочки?
0
Croessmah
++Ͻ
16167 / 9265 / 1775
Регистрация: 27.09.2012
Сообщений: 22,824
Записей в блоге: 2
Завершенные тесты: 2
15.10.2017, 22:04 4
Цитата Сообщение от HitGirl Посмотреть сообщение
При компиляции f(1,2) заменится на (*f)(1,2)
Например, в
Assembler
1
2
3
        mov     edi, 1
        mov     esi, 2
        call    f(int, int)
либо вообще в отсутствие вызова.
Цитата Сообщение от HitGirl Посмотреть сообщение
так же как при обращении к элементам массива заменяются квадратные скобочки?
Причем здесь массив?
2
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
15.10.2017, 22:33 5
HitGirl, зря про массив начал говорить.
Дело в том что имя массива - константный указатель на начало расположения массива в оперативной памяти
То есть array = &array[0];
То же самое с функцией
Имя функции - константный указатель на начало расположения функции в оперативной памяти.
То есть есть у тебя указатель на функцию
int (*Pfun)( void );
Допустим ты создала какую-то другую функцию с такими же типами аргументов, или вообще без них, как у меня.
Чтобы присвоить адрес твоей функции пфану, можно сделать 2 способами
1. Pfun = fun; // типы аргументов пфана и фана должны сопадать
2. Pfun = &fun;
Вызывать же можно тоже 2 эквивалентными способами:
1. (*Pfun)(void);
2. Pfun( void );
0
Mournful Max
Велосипедист...
349 / 216 / 73
Регистрация: 15.12.2015
Сообщений: 785
Завершенные тесты: 1
16.10.2017, 02:32 6
Цитата Сообщение от Michail97 Посмотреть сообщение
Вызывать же можно тоже 2 эквивалентными способами:
1. (*Pfun)(void);
2. Pfun( void );
Точно?
0
Croessmah
++Ͻ
16167 / 9265 / 1775
Регистрация: 27.09.2012
Сообщений: 22,824
Записей в блоге: 2
Завершенные тесты: 2
16.10.2017, 03:52 7
Captain Maxee, если void убрать, то точно.
0
Mournful Max
16.10.2017, 03:57
  #8

Не по теме:

Croessmah, в этом-то и проблема...)

0
HitGirl
10 / 7 / 1
Регистрация: 08.10.2015
Сообщений: 283
Завершенные тесты: 1
16.10.2017, 17:55  [ТС] 9
Цитата Сообщение от Croessmah Посмотреть сообщение
Причем здесь массив?
Например a[1] преобразуется в *(a+1).
Цитата Сообщение от Michail97 Посмотреть сообщение
Дело в том что имя массива - константный указатель на начало расположения массива в оперативной памяти
То есть array = &array[0];
То же самое с функцией
Я могу сделать такое присваивание:
C
1
2
int (*p)(int,int);
p=*********f;
или так передать указатель на функцию в функцию:
C
1
printf("f= %i\n",********f);
А так нельзя:
C
1
2
3
4
int a[10];
int point;
point=*********a;
printf("a= %i\n",********a);
Вот я и пытаюсь понять: почему операция * не влияет на указатель на функцию?
0
Mournful Max
Велосипедист...
349 / 216 / 73
Регистрация: 15.12.2015
Сообщений: 785
Завершенные тесты: 1
16.10.2017, 20:56 10
Лучший ответ Сообщение было отмечено HitGirl как решение

Решение

Цитата Сообщение от 6.5.3.2 Address and indirection operators
4. The unary * operator denotes indirection. If the operand points to a function, the result is a function designator;
Честно говоря, не уверен в своих словах, но я это понимаю так, что:
foo == *foo
Соответственно,
foo == *foo == **foo
И так далее. Где foo — это, например:
C
1
void foo( void ) {}
Добавлено через 1 минуту
Понимаешь, в чем идея? Сколь угодно разыменовывай указатель на функцию — получаешь всегда адрес функции.
1
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
17.10.2017, 07:11 11
Captain Maxee, да, ошибся. Вызывается как обычная функция после объявления
1
HitGirl
10 / 7 / 1
Регистрация: 08.10.2015
Сообщений: 283
Завершенные тесты: 1
17.10.2017, 18:26  [ТС] 12
Спасибо всем за ответы!
0
17.10.2017, 18:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2017, 18:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подскажите, где ошибка (указатель на функцию)
Дана программа в книге Кернигана и Ричи (5.11. Указатели на функцию) #include &lt;stdio.h&gt;...

Указатель на функцию, которая возвращает массив
Данная программа делает следующее: 1) просит ввести пользователя целое число в пределе 1-50...

Исправить функцию, возвращающую указатель на строку
Здравствуйте, не подскажите, как нужно подправить код? char* GetString() { char x; // локальный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.