여기에는 이러한 연산자의 모든 조합이 동일한 방식으로 작동 할 수 있도록 몇 가지가 있습니다.
이러한 모든 작업이 수행되는 근본적인 이유는 (와 같은 foo
) 함수가 함수 에 대한 포인터로 암시 적으로 변환 가능하기 때문입니다. 이것이 void (*p1_foo)() = foo;
작동하는 이유 foo
입니다. 암시 적으로 자체에 대한 포인터로 변환되고 해당 포인터가에 할당됩니다 p1_foo
.
단항 &
은 함수에 적용될 때 객체에 적용될 때 객체의 주소를 생성하는 것처럼 함수에 대한 포인터를 생성합니다. 일반 함수에 대한 포인터의 경우 암시적인 함수에서 함수로의 포인터 변환으로 인해 항상 중복됩니다. 어쨌든 이것이 void (*p3_foo)() = &foo;
작동하는 이유 입니다.
단항 *
은 함수 포인터에 적용될 때 객체에 대한 일반 포인터에 적용될 때 지정된 객체를 생성하는 것처럼 뾰족한 함수를 생성합니다.
이 규칙들을 결합 할 수 있습니다. 두 번째에서 마지막 예를 고려하십시오 **foo
.
- 먼저
foo
암시 적으로 자체에 대한 포인터로 변환되고 첫 번째 *
는 해당 함수 포인터에 적용되어 함수를 foo
다시 생성 합니다.
- 그런 다음 결과는 다시 암시 적으로 자신에 대한 포인터로 변환되고 두 번째
*
는 적용되어 다시 함수를 생성합니다 foo
.
- 그런 다음 암시 적으로 함수 포인터로 다시 변환되어 변수에 할당됩니다.
을 원하는만큼 추가 할 수 *
있으며 결과는 항상 같습니다. *
s가 많을수록 메리 어.
우리는 또한 다섯 번째 예를 고려할 수 있습니다 &*foo
.
- 첫째,
foo
암시 적으로 자신에 대한 포인터로 변환됩니다. 단항 *
이 적용되어 foo
다시 산출 됩니다.
- 그런 다음에
&
가 적용 foo
되어에 대한 포인터가 생성 foo
되고 이에 변수가 할당됩니다.
은 &
전용은 아니지만 (함수 포인터로 변환 된 함수에 대한 함수에 적용 할 수 물론 함수 포인터 결과가 가리키는 포인터 A-포인터 타입 인 경우의 변수이며, 않으면 기능을 수행합니다 (예 : 목록에 추가 할 수 있음 void (**pp_foo)() = &p7_foo;
).
이것이 &&foo
작동하지 않는 이유입니다 &foo
. 함수가 아닙니다. rvalue 인 함수 포인터입니다. 그러나 &*&*&*&*&*&*foo
마찬가지로, 일하는 것이 &******&foo
있기 때문에 그 표현의 모두에서 &
항상 함수에 아닌를 rvalue의 함수 포인터에 적용됩니다.
*
함수 포인터를 통해 호출 할 때 단항식 을 사용할 필요는 없습니다 . 모두 (*p1_foo)();
와 (p1_foo)();
다시 때문에 함수에 대한 함수 포인터 변환에, 동일한 결과를 갖는다.
&foo
의 주소를 가져 와서foo
함수 포인터가을 가리 키도록합니다foo
.