Подтвердить что ты не робот

Какое использование нескольких звездочек в вызове функции?

Я не думаю о практическом использовании нескольких звездочек в вызове функции:

void foo(int a, char b)
{

}

int main(void)
{
    (**************foo)(45, 'c');

    //or with pointer to function:
    void (*ptr)(int, char) = foo;
    (******ptr)(32, 'a');
}

Почему эта вещь разрешена как на C, так и на С++?

4b9b3361

Ответ 1

Почему эта вещь разрешена как на C, так и на С++?

Я не могу говорить для С++, но для C по меньшей мере обозначение функции преобразуется в указатель:

6.3.2.1 - 4

Обозначение функции - это выражение, имеющее тип функции. Кроме когда это операнд оператора sizeof или унарный и оператор, обозначение функции с типом возвращаемой функции типа '' преобразуется в выражение, которое имеет тип '' указатель на функцию возвращаемый тип.

Применение оператора косвенности дает обозначение функции:

6.5.3.2 - 3

Унарный * оператор обозначает косвенность. Если операнд указывает на функция, результатом является обозначение функции

Итак, независимо от того, сколько раз вы применяете оператор косвенности, вы получите то же самое: обозначение функции, которое сразу преобразуется в указатель.


По моему мнению, это мало или вообще не используется для этого.

Ответ 2

Одним из стандартных преобразований, как в C, так и в С++, является преобразование функции в указатель; когда в выражении появляется имя функции, оно может быть преобразовано в указатель на эту функцию. Итак:

  • foo эквивалентен &foo
  • *foo эквивалентен *(&foo), или foo
  • **foo эквивалентен **(&foo), или *foo, или foo

и т.д.

Это означает, что вы можете юридически добавить столько *, сколько хотите, перед именем функции без изменения ее значения. Нет никаких оснований для этого.

Ответ 3

Потому что оператор * ожидает значение адреса. И всякий раз, когда ожидается значение (в отличие от объекта или функции glvalue), lvalue to rvalue, функция для преобразования указателя и массива в указатель применяется к операнду. Таким образом, функция разыменования немедленно снова преобразуется в указатель, когда снова разыменовывается.

Все они либо считывают значения из объектов, либо производят значение указателя, которое ссылается на начало массива или функции соответственно.

Эти строки разметки не имеют никакой цели, кроме как для lulz.

Ответ 4

Как я понимаю, это

* is a pointer to a memory address
& is the value at the Memory address

*foo means pointer to foo memory address
**foo means *(*foo) *(foo memory address) This is a different value from *foo

он продолжается так...