Я возился с указателями функций и заметил кое-что в следующей программе:
#include <stdio.h>
int operation (int x, int y, int (*fptr)(int, int))
{
int z;
z = (*fptr)(x, y);
return (z);
}
int add(int a, int b) {
return a+b;
}
int main(int argc, char** argv) {
/* This line */ printf("%d\n", operation(1, 2, add));
}
Запуск этой программы приводит к 3, как и должно быть.
Однако в строке, отмеченной /* This line */
, я заметил, что если строка была изменена на любой из этих двух других вариантов, это также привело к 3: printf("%d\n", operation(1, 2, *add)
и printf("%d\n", operation(1, 2, &add)
(обратите внимание на добавленные звездочку и амперсанд).
Это также работает, когда я пробовал такие вещи, как printf("%d\n", operation(1, 2, *(&add)));
и printf("%d\n", operation(1, 2, &(*add)));
(что я предположил, увидев выше).
Мне было интересно, почему это так, и есть ли разница между двумя вариантами. Является ли это неопределенным поведением, и мне просто повезло, предполагает ли компилятор, что все это означает одно и то же, или здесь происходит что-то странное, чего я не понимаю?
x
и*x
одинаковы - person M.M   schedule 14.04.2015