여기에는 이러한 연산자의 모든 조합이 동일한 방식으로 작동 할 수 있도록 몇 가지가 있습니다.
이러한 모든 작업이 수행되는 근본적인 이유는 (와 같은 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.