Является ли имя функции адресом первой инструкции этой функции в c? - PullRequest
0 голосов
/ 09 июля 2020

Почему компилятор говорит, что это не указатель:

#include <stdio.h>

double f(){ return 1.2; }
int main(){

    int i=0;
    double d =f()[0]; //f() is not pointer? it should be
    printf("%i\n",d);
}

ошибка:

subscripted value is neither array nor pointer nor vector
  double d =f()[0];

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

#include <stdio.h>

int op(int (*op)(int,int), int a, int b){ return op(a,b); }
int add(int a, int b){ return a+b; }

int main(){
    printf("%i\n",op(add, 1, 2)); //here: add() will magically become pointer, different context
}

Итак, в первом случае я хотел разыменовать функцию, в надежде, что имя функции - указатель (и поэтому разграничение разрешено ). Во втором примере указатель на функцию объявлен с указателем, поэтому функция add будет преобразована в указатель (сравните с printf("%i\n",op(&add,1,2))) также будет работать. Так почему проблема с первым?

1 Ответ

1 голос
/ 09 июля 2020

Для функции f или вообще вызываемой функции f() вызывает функцию и оценивает тип, объявленный как тип возвращаемого значения функции. Функции могут преобразоваться в указатель на функцию, как и массивы, но когда вы вызываете функцию, этого не происходит:

int foo(int,int){ return 1;}

int main() {
    using fptr = int (*)(int,int);
    fptr p = foo;                    // <- function pointer (note: no & needed because it decays to function pointer)
    fptr q = &foo;                   // <- also function pointer
    int x = foo(1,2);                // <- function call
}

В ваших примерах:

double d =f()[0]; //f() is not pointer? it should be

Нет, f() не является указателем. f возвращает двойное значение.

printf("%i\n",op(add, 1, 2)); //here: add() will magically become pointer, different context

Нет. add() волшебным образом не станет указателем. add - это функция, которая автоматически превращается в указатель функции (на самом деле это не "magi c").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...