IT이야기

C 함수 포인터 구문

cyworld 2022. 5. 13. 23:56
반응형

C 함수 포인터 구문

내 질문은 아주 간단한 것이다.

일반적으로 변수를 선언할 때 다음과 같이 변수의 유형을 앞에 두십시오.

int a;

함수 포인터에는 다음과 같은 형식이 있을 수 있다.int(*)(int,int)두 개의 정수를 사용하고 정수를 반환하는 함수를 가리킬 경우.그러나 그러한 포인터를 선언할 때 식별자는 다음과 같이 형식을 쫓지 않는다.

int(*)(int,int) mypointer;

대신 식별자를 가운데로 작성해야 한다.

int(*mypointer)(int,int);

왜 그런가?미안, 민망할 정도로 쉬운 질문인 건 알지만...

모두들 답장해줘서 고마워.틀:축구단

어레이, 포인터 및 기능에 대한 C 구문이 왜 이렇게 설계되었는가?라는 질문에 이렇게 설명하며, 기본적으로 다음과 같이 요약된다.

언어 저자들은 구문을 유형 중심보다는 가변 중심적으로 만드는 것을 선호했다.즉, 그들은 프로그래머가 선언문을 보고 "만약 내가 그 표현을 쓴다면" 라고 생각하기를 원했다.*func(arg)그렇게 되면...int; 만약 내가 글을 쓴다면*arg[N]"난 떠다닐 거야"가 아니라func이것을 가져다가 그것을 반환하는 함수의 포인터가 되어야 한다."

위키피디아의 C 항목은 다음과 같이 주장한다.

Ritchie의 아이디어는 식별자를 그들의 용도와 유사한 맥락에서 "사용에 대한 선언"이라고 선언하는 것이었다.

...K&R2의 p122를 콕 찍어.

이 구조는 정상 함수를 선언(및 사용)하는 방법을 반영한다.

정상 함수 정의를 고려하십시오.

int foo (int bar, int baz, int quux);

이제 동일한 서명의 함수에 대한 함수 포인터를 정의하는 것을 고려하십시오.

int (*foo) (int, int, int);

두 구조물이 어떻게 서로 거울을 비추는지 알아?그렇게 되다*foo다른 것보다 기능 포인터로 식별하는 것이 훨씬 쉽다.

나는 몇몇 장소에서 다음과 같이 선언된 기능 포인터를 본 적이 있다.

int (*foo) (int a, int b);

그리고 어떤 곳에서는a그리고b언급되지 않고 둘 다 여전히 효과가 있다.

그렇게

int (*foo) (int, int)

또한 정확하다.

내가 기억하는 아주 간단한 방법은 다음과 같다.

함수가 다음과 같이 선언된다고 가정하십시오.

int function (int a , int b);

1단계: 기능을 괄호 안에 넣으십시오.

int (function) (int a , int b);

2단계: 배치 a*함수 이름 앞에 있는 이름을 변경하십시오.

int (*funcPntr) (int a , int b);

PS: 나는 이 답변에서 규약 등을 명명하기 위한 적절한 코딩 지침을 따르고 있지 않다.

함수(한 함수에 대한 포인터가 아님)를 다루고 있다면, 그 이름도 가운데에 있다.다음과 같다.return-type function-name "(" argument-list ")" .... 예를 들어,int foo(int),int반환 유형,foo이름 그리고int논점 목록

함수에 대한 포인터는 거의 같은 방식으로 작동하는데, 반환 유형, 이름, 인수 목록 등이 그것이다.이 경우 a를 추가해야 한다.*포인터로 삼기 위해서, 그리고 (이후부터)*포인터가 접두사인 경우) 바인딩할 괄호 쌍*반환 형식 대신 이름에 연결하십시오.예를 들어,int *foo(int)이다.다음 *을(를) 얻기foo대신, 우리는 괄호가 필요하다.int (*foo)(int).

이것은 기능을 위한 일련의 포인터가 필요할 때 특히 더 보기 흉해진다.이러한 경우 대부분의 사용자는 포인터 유형에 대해 typeef를 사용한 후 해당 유형의 배열을 만드는 것이 가장 쉽다는 것을 알게 된다.

typedef int (*fptr)(int);

fptr array[10];

참조URL: https://stackoverflow.com/questions/14114749/c-function-pointer-syntax

반응형