C

- 함수 포인터 , void형 포인터 -

룸훼훼 2010. 10. 20. 20:53
반응형
프로그래머가 정의한 모든 함수는 프로그램 실행 시 메인 메모리(main memory)에 올라가게 된다.

메모리 상에 올라간 다음에 실행이 가능하기 때문이다.

이때 함수의 이름은 메모리 상에 존재하는 함수의 위치를 가리키는 주소 값을 의미한다.

즉, "함수의 이름은 메모리상에 존재하는 함수의 위치를 가리키는 포인터"이다.

그럼  함수의 이름이 주소 값을 지니는 포인터라면,

함수의 이름과 동일한 타입의 포인터 변수를 선언해서 그 값을 저장할 수 있지 않을까?

이러한 기능을 하는 포인터를 가리켜 함수 포인터라 한다.
 

 

 (2) 함수 포인터의 포인터 타입은 어떻게 되는가?

  함수 이름의 포인터 타입을 결정짓는 요소는 리턴형전달인자다.

 int fct1 (int a) // 맨 왼쪽은 리턴형, 맨 오른쪽 괄호 안은 전달인자다.

 그러므로 fct1은 "반환형이 int이고 전달 인자가 int형 변수 하나이다" 라고 할 수 있다.

 

 

(3) void형 포인터

 void 포인터는 어떠한 뭐든 담을 수 있는 바구니에 비유할 수 잇다.

 void 포인터 변수를 선언하게 되면 변수이건, 함수이건, 하다못해 포인터의 주소 값까지도 저장이 가능하다.

 다음은 void 포인터를 선언하는 방법과 값을 대입하는 방법을 보여준다.

 

  하지만 void 포인터를 가지고는 아무런 일도 하지 못한다.

  값을 변경하거나 참조하는 일들, 포인터 연산까지도 허용이 되지 않는다.

  포인터 자체에 데이터에 대한 정보(몇 바이트를 읽어 들여야 하는지)가 없으므로 이는 당연한 것이다.

  위의 오른쪽 코드 3, 4번째 줄은 오류를 발생시킨다.

  왜냐하면 void 포인터는 주소 값을 저장하는 것 이외에 아무것도 할 수 없기 때문이다.

  따라서 void 포인터는 결국 명시적 형 변환 과정을 거쳐서 사용하게 된다.

  "일단 주소 값을 저장해 두고, 포인터 타입은 나중에 결정한다"는 전략을 세울 때 필요한 포인터로서 '메모리 동적 할당'에 쓰인다.

 예)



void는  반환값을 가지지 않는다.
그래서 int , short같은 자료형을 담을수 있는데 물론 casting을 시켜줘야 한다.

반응형

'C' 카테고리의 다른 글

- 연결리스트 -  (0) 2010.12.29
- 동적배열 - malloc()  (0) 2010.10.21
- #pragma -  (0) 2010.10.20
- 비트 연산자 -  (0) 2010.10.18
- goto문 -  (0) 2010.10.18