포인터

p와 *p를 구분하자.




포인터 변수 : 주소값을 저장하는 변수라고 이해하면 편하다.
포인터 변수의 선언은 int *a; 요렇게 하면된다.
주소값의 저장은 아래와 같이 한다.
int b = 0;
a = &b;
cout << a;    // a 가 저장하고 있는 실제 주소값을 출력한다.
cout << *a;  // a 가 가르키고 있는 주소값의 주인공인 b 를 참조하게 된다. 즉, *a는 b  와 같다.

  
const 와  포인터변수를 사용할때에는 주의를 해야 한다.
int c = 10;
int d = 20;

const int* p1;           //1
int* const p2 = &c;   //2

위의 1번 2번 문장은 완전히 틀리다.
1번의 경우는 이 변수가 참조할 다른 int 형 변수는 상수가 되어 변경이 불가능하게 된다. 즉
 
p1 = &b; 는 가능하지만 *p1 = 23; 은 에러가 발생.

2번의 경우 p2 가 const 으로 지정이 되어있으므로 다른 주소값을 받지 못하게 된다. 즉
*p2 = 23; 는 가능하지만 p2 = &d; 는 에러가 발생.

 const 다음에 뭐가 있는지 보면 이해하기 편하다.
const int* p1 이 구문을 보면 int가 const으로  지정되었기 때문에, 이 변수가 참조하게되는 값은 상수가 되는 것이다.. 그리고 int* const p2 를 보면 p2가 const 으로 정의되었다. p2는 포인터변수인데 위에서 포인터 변수는 주소를 담는 변수라고 했다. 그 포인터 변수가 상수로 지정되었으므로 주소값 변경이 불가능하게 된다라고 이해하면 한결 편하다.

상수를 포인터로 참조할때는 상수 포인터로 상수의 주소값을 담아야 한다.
const int a = 10;
int* b = &a;                 //   에러
const int* c = &a;        //   성공

상수를 포인터변수에 담을때에는 반드시 const 포인터 변수로 참조를 해야한다.



구조체의 포인터를 참조할때는 ( ) 를 사용하거나 -> 를 사용하자.
struct Point{
int x, y;
};
와 같은 구조체가 있을때
Point point1;
Point *point2 = &point1;
이렇게 했다고 하자. 이때 x, y을 참조하고 싶을때에는 이렇게 해야한다.
(*point2).x; (*point2).y

이유는 바로 . *보다 우선순위가 높기 때문이다. 반드시 ()를 사용하자.
하지만 -> 를 사용하여 더 간편하게 참조하는 방법이 존재한다.
point2->x ;  point2->y;

그냥 -> 사용하자.



this 는 상수 포인터이다.


'언어 > C/C++' 카테고리의 다른 글

Class(클래스)  (0) 2010.06.16
const 인수  (0) 2010.06.15
참조 변수  (0) 2010.06.15
동적 메모리 할당 및 반환  (0) 2010.06.15
C++ 을 시작하자!!  (0) 2010.06.15