programing

함수 호출에 여러 별표를 사용하면 무슨 소용이 있습니까?

mailnote 2023. 8. 29. 20:47
반응형

함수 호출에 여러 별표를 사용하면 무슨 소용이 있습니까?

함수 호출에서 여러 별표를 실제로 사용하는 방법은 생각할 수 없습니다.

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와 C++ 모두에서 허용됩니까?

C와 C++ 모두에서 표준 변환 중 하나는 함수에서 포인터로의 변환입니다. 함수 이름이 식에 나타나면 해당 함수에 대한 포인터로 변환될 수 있습니다.그래서:

  • foo와 동등합니다.&foo
  • *foo와 동등합니다.*(&foo)또는foo
  • **foo와 동등한**(&foo)또는*foo또는foo

등등.

이것은 합법적으로 더 많은 수를 추가할 수 있다는 것을 의미합니다.*함수 이름 앞에서 의미를 변경하지 않고 원하는 대로 사용할 수 있습니다.하지만 그럴 이유는 없습니다.

왜 이것이 C와 C++ 모두에서 허용됩니까?

C++은 말할 수 없지만, C의 경우 적어도 함수 지정자가 포인터로 변환됩니다.

6.3.2.1 - 4

함수 지정자는 함수 유형을 가진 표현식입니다.연산자 또는 단항 연산자 크기의 피연산자인 경우를 제외하고, ''함수 반환형'' 유형을 가진 함수 지정자는 ''함수 반환형'' 유형을 가진 식으로 변환됩니다.

방향 연산자를 적용하면 함수 지정자가 생성됩니다.

6.5.3.2 - 3

단항 * 연산자는 방향을 나타냅니다.피연산자가 함수를 가리킬 경우 결과는 함수 지정자가 됩니다.

그래서 당신이 몇 번이나 방향 연산자를 적용하든, 당신은 같은 것을 얻을 것입니다: 바로 포인터로 변환되는 함수 지정자.


제 생각에는 이것을 하는 것이 거의 또는 전혀 소용이 없다고 생각합니다.

왜냐하면.*연산자에 주소 값이 필요합니다.그리고 (객체나 함수 glvalue와 반대로) 값이 예상될 때마다 lvalue to rvalue, 함수 to pointer, 배열 to pointer 변환이 피연산자에 적용됩니다.따라서 참조되지 않은 함수는 다시 참조되지 않을 때 즉시 포인터로 변환됩니다.

이들은 모두 객체에서 값을 읽거나 배열 또는 함수의 시작 부분을 각각 참조하는 포인터 값을 생성합니다.

이러한 일련의 언급들은 그것의 전체를 위한 것 외에는 다른 목적이 없습니다.

내가 이해하는 방법은

* 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

그것은 ...처럼 계속됩니다.

언급URL : https://stackoverflow.com/questions/12192368/whats-the-use-of-multiple-asterisks-in-the-function-call

반응형