포인터 변수 - 1
포인터 변수는 말그대로 변수를 가리키는 변수, 주소를 자료형으로 갖는 변수다. 전에 변수 설명에서 변수는 메모리 공간 특정 위치에 저장공간을 할당받는다고 했었다. 그리고 그 안에 값을 넣을 때 변수의 이름을 가지고 접근을 한다. 하지만 그외에 접근 방법이 없을까? 그것이 바로 포인터 변수이다. a라는 변수가 있는데 그 안에 값을 쓸 떄 변수 이름을 가지고 메모리 공간에서 그 변수의 위치를 찾아가도 되고, 이름이 아닌 변수의 위치 = 주소를 가지고 찾아가서 쓸 수 있다는 말이다. 포인터 변수는 주소를 값으로 가진다. 자료형에 상관 없이 4바이트의 크기를 가진다.
Ex> int a = 0; // a를 메모리 공간에 할당.
int *p = &a; // a의 주소를 포인터 변수 p에 저장.
&는 주소지정 연산자라고 해서 변수명 앞에 붙으면 해당 변수의 주소 값을 의미한다.
*는 간접지정 연산자라고 해서 포인터 변수를 선언할 때 일반 변수와 구분하기 위해 사용한다.
※포인터 변수도 말 그대로 변수이다. 포인터 변수도 선언을 하면 메모리 공간을 할당 받기때문에 자기자신의 주소도 존재한다. 포인터 변수를 사용시 주소에 저장된 값의 자료형에 맞게 포인터 변수의 자료형도 동일해야한다.
- 예제 소스 코드
int a = 0;
int *p = &a; // 포인터 p에 a의 주소 값을 넣음. 포인터 p는 a를 가르킴.
cout << "a의 값 : " << a << endl;
cout << "a의 주소 : " << &a << endl;
cout << "p의 값 : " << p << endl;
cout << "p의 주소 : " << &p << endl;
cout << "p가 가르키는 주소에 들어있는 값 : " << *p << endl; // 포인터 변수를 통해 값에 접근할 때는 간접지정 연산자를 사용한다.
출력 결과는 위와 같다.
변수 a의 주소와 포인터 변수 p의 값(주소 값)이 동일하며, 포인터 변수 p도 하나의 변수이기 때문에 메모리 공간에 저장공간을 할당받고 있다. 포인터 변수 p가 가지고 있는 값과 변수 a의 주소 값은 동일하지만 포인터 변수 p의 주소는 다르다. 포인터 변수 p의 값과 포인터 변수 p의 주소는 별개라는 것을 잘 기억하자. 포인터 변수 p가 가지고 있는 주소 값을 따라 접근을 하면 변수 a의 주소를 찾아가 그안에 저장되어 있는 0이라는 값을 만나게 된다. 이를 참조라 한다.
자료형이 다른 변수를 포인터 변수가 참조하려고 하면 위와 같은 컴파일 오류가 발생한다. 같은 자료형을 지정해야하는 것을 기억하자.
포인터 변수는 주소 값을 가지고 참조를 한다고 했다. 그럼 포인터 변수를 가지고 참조하고 있는 변수의 값을 변경시켜보자.
- 소스 코드 예제
int a = 10;
int *p = &a;
cout << "a의 값 : " << a << endl;
cout << "p의 참조 값 : " << *p << endl; // 주소 값을 통해 참조시에는 *를 붙이는 것을 잘 알아두자. p가 참조하는 변수의 값을
// 출력.
a = 20;
cout << "a의 값 : " << a << endl;
cout << "p의 참조 값 : " << *p << endl;
*p = 50; // 포인터 변수의 참조를 통한 값 변경.
cout << "a의 값 : " << a << endl;
cout << "p의 참조 값 : " << *p << endl;
결과는 위와 같다. 포인터 변수의 참조를 통해 값을 변경 했으며 변수 a의 값이 변경 되면 자연히 변수 a를 참조할 때 값도 변경된다.
a = 20; 여기서 변수 a의 값이 변경되는 것과 포인터 변수 p의 연관성은 전혀 없다. 단순히 a의 값이 변경된 것이고 포인터 변수 p가 가지고 있는 주소 값을 통해 변수 a의 값을 참조 했을 때는 당연히 a의 값(이미 변경된 값)을 가져오는 것 뿐이다.
처음 공부하는 과정에서 *, & 이 두 연산자를 쓰는 것에 대해서 어려워하는 사람이 많은데 이에 관해서는 많은 설명 방법이 있는데 개인적으로는 이렇게 이해하고 있다.
&는 주소가 적힌 종이.
*는 주소를 따라서 가보고 와라.
1. int a;
2. int *p = &a;
3. cout << &a << endl;
4. cout << *p << endl;
여기서 3번과 4번에 대해 설명하면 3번 &a는 변수 a의 주소가 적힌 종이이다. 그러므로 변수 a의 주소를 출력하는 것 된다. 4번은 포인터 변수 p가 가진 주소 값을 따라서 가보고 와라이다. 그러므로 포인터 변수 p가 참조하고 있는 값을 출력하는 것이 된다.
결론, 참조하고 있는 값에 관한 것이면 *연산자를 주소가 필요한 경우에는 &연산자를 사용하면 된다.
설명이 잘 되었기를 바랍니다. (추후 call by address를 설명하게 되면 좀 더 자세히 설명하겠습니다.)
- 출처 : 열혈강의 C++ 언어본색
※ 책을 보고 공부한 내용을 정리하였기때문에 내용이 책과 다를 수 있습니다.
'Program Languege > C/C++' 카테고리의 다른 글
문자열 (0) | 2013.02.17 |
---|---|
배열 (0) | 2013.02.17 |
네임스페이스 (0) | 2013.02.15 |
반복문 (0) | 2013.02.14 |
조건문 switch (0) | 2013.02.14 |