연재 완료/C Lang 이론

C언어 이론 8. 포인터 (void포인터와 NULL포인터, 함수 포인터)

라이피 (Lypi) 2018. 5. 23. 17:03
반응형


내용 출처 : YES C (정보공학연구소 /생능출판사)

                  혼자 연구하는 C/C++ (SoEn.kr /와우북스)



Ⅰ. void* vp;

   ① void형은 함수의 리턴타입이 없을때 혹은 포인터에만 사용할 수 있는 특수한 타입이다.

   ② void* vp;의 형태로 void형 포인터를 선언할 수 있다. 

   ③ void* vp;는 대상체가 정해져 있지 않다는 뜻으로 어떤 타입이든 가리킬수 있다.

   ④ void* vp;는 어떤 타입의 주소든 저장할 수 있다. ex) int i; char c; void* vp; vp = &i; vp = &c; 

   ⑤ 하지만 반대로 임의의 T형 포인터 T* tp에 void* vp는 대입할 수 없다. 

   ⑥ int* ip;에 void* vp;를 대입하려 한다면 (int *)vp;로 캐스팅을 해야한다. ex) ip = (int *)vp; 

   ⑦ void* vp;는 자신이 어떤 타입을 가리키고 있는지에 대한 정보가 없으므로 *연산자로 값을 읽을 수 없다.

   ⑧ 값을 읽고자 한다면 ⑥에서와 같이 캐스팅을 먼저 하고 읽어야 한다. ex) *(int*)vp;

   ⑨ 증감연산자도 쓸 수 없다. 이 또한 캐스팅을 하고나서 가능해지는데 vp = (int*)vp +1; 의 형태가 안정적이다. 

   ⑩ 즉, void형 포인터는 딱 시작주소만 가지고 있는 포인터이므로 일반 포인터와 같이 사용하고자 한다면 원하는 타입으로 캐스팅을 해줘야한다.


Ⅱ. NULL 포인터

  ① 기본적으로 포인터 변수에 상수값(메모리의 절대주소)을 대입하는 것은 금지되어 있다.

  ② 유일한 예외는 NULL로 정의되어 있는 0을 대입하는 것으로 0이 대입되어 있는 포인터를 NULL포인터라 부른다.

  ③ NULL포인터는 실제로 메모리 주소가 0인 곳을 가리키고 있는 것이 아니라 아무 곳도 저장되어 있지 않음을 의미한다.

  ④ 포인터를 리턴하는 함수들은 에러가 발생했을 경우 대부분 NULL포인터를 리턴한다. 


Ⅲ. 함수 포인터

  ① 함수포인터란 '리턴값과 인수리스트가 같은 임의의 함수를 가리킬 수 있는 포인터'이다.

  ② 원형이 int sample1(); , int sample2(); 라는 두개의 함수가 있다면 int (*fp)(); 라는 함수 포인터를 선언해서 둘을 가리킬 수 있다.

  ③ ②와 같이 선언했다면 fp = sample1; 의 형태로 대입하면 fp(); 와 sample1();이 동일하게 작동한다.

  ④ 함수포인터도 캐스팅 연산이 가능하다. 

  ⑤ 임의의 함수 포인터를 int (*fp)(); 에 대입하기 위해서 캐스팅을 한다면 캐스팅 연산자는 (int (*)()) 이 된다.

  ⑥ 이게 복잡하다면 함수포인터 형태를 사용자정의형으로 지정해서 사용하면 된다.

  ⑦ 위의 int (*fp)()를 사용자정의형으로 정의해두고 싶다면 typedef int (*FPT)(); 라는 형식으로 쓸 수 있다. 

  ⑧ 여기서 FPT가 사용자정의형의 명칭이 된다.


/* 

포인터에 대한 내용들은 soen.kr에 훨씬 자세한 설명들이 많이 있으므로 참조하자.

블로그에는 책의 순서를 기준으로 간략한 내용만 적었다.

*/











반응형