그냥 단순하게 나누자면,
1. 단일로 사용할때
선언 : AAA a;
사용 : a.b;
2.1 배열이고, 길이가 고정일때
선언 : AAA a[상수];
사용 : a[위치].b;
2.2 배열이고, 런타임시 길이가 가변일때
선언 : AAA *a;
사용 :
a = new AAA[길이];
a[위치].b;
delete[] a;
a=NULL;
3. 단일/배열에 상관없이 이미 선언된 변수의 값을 사용할 때;
3.1 이미 선언된 변수가 단일일때 (AAA c;)
선언 : AAA *a=NULL;
사용 :
a = &c;
a->b;
a=NULL;
3.2 이미 선언된 변수가 배열일때 (AAA *c; or AAA c[상수];)
선언 : AAA *a=NULL;
사용 :
a = c;
a[위치].b;
a=NULL;
3.3 이미 선언된 변수가 배열이고 특정 위치(1)의 값을 사용할 때,
선언 : AAA *a=NULL;
사용 :
a = &c[1];
a->b; (c[1].b의 값)
a[1].b; (c[2].b의값)
a=NULL;
3번 부터는 a->b 나 a[위치].b 에 어떤 값을 대입 할 경우엔 c의 값이 변하게 됩니다.
(참고로 a->b 는 a[0].b 와 같습니다.)
또한 포인터를 사용 시 NULL로 초기화 하고 사용 후 NULL로 채워 주는 행위는 대부분의 책에서 권장하는 사용 법입니다.
(포인터가 NULL 이라는건 아무것도 가르키지 않는다는 의미입니다.)
이렇게 하지 않을 시 어떤 오류가 어떻게 발생할지 알 수 없기 때문입니다.
다소 비약적인 예를 든다면... 어떤 함수 에서 int d=10; 라는 지역변수를 사용했는데,
지금 사용하는 함수에서 AAA *a 라고 선언 후, 실수로 아무 값도 대입하지 않으면,
a는 10 이라는 메모리 주소의 어떤 값을 가르키게 될 수도 있습니다.
이 때 10 라는 메모리 주소의 값이 수정이 불가능 한 경우(const 라던가, private 라던가..)라면
다행히 Access Violation Error가 발생하고, 디버깅을 할 수 있지만
수정이 가능한 경우라면, 어디의 값이 어떻게 변하는지 아무도 알수가 없습니다.
만약 10 이라는 위치가 어떤 Component 의 Caption일 경우, Caption이 비정상적인 값으로 변하게 되는거죠.
설명이 좀 길어졌는데...
배열, 포인터, 메모리 구조 등을 공부 하시면 의문이 풀리실겁니다.
구조체 님이 쓰신 글 :
:
: struct AAA
: {
: int a;
: int b;
: );
:
:
: AAA구조체를 만들고
:
: 선언을
:
: 1. AAA aaa; <--이렇게도 하고
: 2. AAA *aaa; <--이렇게도 하고
: 3. AAA *aaa = new AAA <--이렇게도 하는데
:
: 어느걸 선언하던지
: aaa->a = 1; (aaa.a = 1;)
: aaa->b = 2; (aaa.b = 2;)
:
: 이런식으로 다 사용이 가능한데요
:
: 세번째 new해서 메모리 공간을 생성 하는건 delete하기 전까지 계속 쓰겠다는 의도인거는 알겠는데요
: 첫번째 선언과 두번째 선언은 그냥 개발자 맘대로 선언하는건가요??
:
: 서로 차이점을 알려주시면 감사하겠습니다.
: