저는 포인터에 대해서 제대로 이해하기 시작한것이
윈도우 프로그래밍을 시작하면서 부터입니다.
윈도우 프로그래밍을 접하면 가장 처음에 보이는 것이
코드: |
LPCSTR lpCmdLine; |
로 이것을 쓰면서부터 포인터에 대한 깨달음을 얻게 되었습니다.
이전까지는
인용: |
const char *lpCmdLine; 자료형 포인터변수; |
이런 느낌으로 포인터란 좀 특이한 형태의 변수라고 생각했었는데
인용: |
const char* lpCmdLine; 자료형 변수; |
이런식으로 표기하기 시작하면서부터 모든 것이 자료형 변수 형태로 정리되어 보이기 시작했습니다.
---------------
여기서 잠시 딴지 ~(-_-)~
const char *ptr; 자료형을 선호하시는 분들은
const char* 표기시 한줄에 두개의 포인터 변수를 선언할때 문제가 생길 수 있다는 점을
이야기하곤 합니다.
코드: |
const char* a, b; // a, b 모두 const char* 자료형인가? (보기에도 아닌 것 같습니다만, 실제로도 아닙니다. ) |
위는 정확하지 않은 문법으로 올바른 c 언어 포인터 변수 선언은
코드: |
const char *a, *b; // const char* 변수를 두개 만들려면 이런식으로 표기해야합니다. |
입니다. 반면;;
코드: |
typedef const char* pstr; pstr a, b; // 아무 문제 없음 |
위의 예를 봐서 잘못된게 아닐까 싶지만 a, b 모두 정상적인 const char* 자료형입니다.
그래서 개인적인 의견으로;;
*포인터변수표기법은 c 언어 문법의 한계라고 생각하며
자료형* 표기법을 쓰되 파싱상의 문제를 극복하기 위해
인용: | ||||
1. 라인별 독립적인 변수 선언(추천)
2. typedef 사용
|
이런 방법을 활용하는게 좋지 않나라는 생각입니다.
---------------
최종적으로 "자료형 변수명" 표기법이 제대로 머리속에 인식되면
아래와 같은 표기도 이제는 볼만해지게 됩니다.
코드: |
typedef Device* DevicePtr; bool GetDevice(DevicePtr* out_device) { *out_device = new Device; (**out_device).Func(); // 아직까지 참조하려면 복잡합니다. (*out_device)->Func(); // 어려워라... return true; } Device* device; GetDevice(&device); // scanf 때 많이 써본 느낌이죠 |
c++ 의 레퍼런스 기능을 조금만 활용해서 (레퍼런스는 솔직히 c 언어 표준에도 들어가야 한다고 생각합니다. )
c# 느낌처럼 표기하는 방법도 있습니다.
코드: |
#define out // 원래 필요하지는 않지만 이해를 돕기 위한 매크로 bool GetDevice(Device*& out_device) { out_device = new Device; out_device->Func(); Device& local_device = *out_device; return true; } Device* device; GetDevice(out device); // GetDevice(device) 로 써도 되지만 Get하는 느낌이 다소 약하므로 더미 out 을 붙임 |
위의 표현을 순수 c언어로만 표기하면 아래와 같습니다.
코드: |
Device* NewDevice(); bool GetDevice(Device** out_device) /* 별표 들의 난무 */ { *out_device = NewDevice(); /* 별표 들의 난무 */ (**out_device).Func(); /* 별표 들의 난무 */ (*out_device)->Func(); /* 별표 들의 난무 */ return true; } Device* device; GetDevice(&device); |
~(-_-)~ 별이 많으면 경력자도 난감해지는건 마찬가지랍니다.
http://www.gpgstudy.com/forum/viewtopic.php?t=13211