'포인터'에 해당되는 글 1건

  1. 2009.01.09 포인터 조언

포인터 조언

Visual Studio 2009. 1. 9. 12:53

저는 포인터에 대해서 제대로 이해하기 시작한것이
윈도우 프로그래밍을 시작하면서 부터입니다.

윈도우 프로그래밍을 접하면 가장 처음에 보이는 것이
코드:
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. 라인별 독립적인 변수 선언(추천)
코드:
const char* a;
const char* b;


2. typedef 사용
코드:
typedef const char* stringz;
stringz a, b; // 가능하면 이런 경우에도 라인별 표기법을 쓰는게...


이런 방법을 활용하는게 좋지 않나라는 생각입니다.

---------------

최종적으로 "자료형 변수명" 표기법이 제대로 머리속에 인식되면
아래와 같은 표기도 이제는 볼만해지게 됩니다.

코드:
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
Posted by 철냄비짱
,