본문 바로가기
IT/C Language

C++ 초보를 위한 포인터

by Jang HyunWoong 2014. 12. 19.

<서론>

C언어의 포인터에 대한 이야기를 해보려고 합니다. 

나를 위한, 초보자들을 위한 글입니다. 

 

컴퓨터의 기억공간 = 메모리에 일정한 크기 단위로 번지를 붙여서 관리합니다.

이렇게 메모리의 한 공간에 붙은 번지를 주소라고 합니다. 

 

포인터는 특별한 변수인데요, 변수의 주소를 알아내어 저장할 수 있습니다.

 

프로그램에서 다루는 대부분의 변수는 RAM(메모리)이라는 곳에 만들어 집니다. 

메모리의 크기는 바이트(byte)단위로 나타냅니다. 

 

바이트는 1비트(0 or 1)가 8개 모인 것이라 생각할 수 있습니다. 

11111111 or 0000000 ....

한 자리당 1 or 0이 표현가능하므로 2의 8승 128개의 신호를 표시할 수 있습니다. 

 

메모리를 효율적으로 관리하기 위해 메모리를 바이트 단위로 째갠 뒤 각 단위마다 번지를 붙이는 방식을 사용합니다. 이 번지를 다른 말로 주소 or address 라고 부르기도 합니다. 

 

 

<본론>

 

int num; // int형 변수 num 선언

 

위와 같이 변수 num을 int형으로 선언하면 메모리에 4바이트 크기의 공간을 차지하게 됩니다. 

why? 4바이트? int 형은 4바이트의 형식을 가집니다. (아래 표 참고)

 

 

변수가 메모리 안에 차지하는 공간을 기억공간(memory space)라고 부릅니다. 

기억 공간의 크기는 컴퓨터 환경이나 운영체제 또는 컴파일러에 따라 달라집니다. 

 

변수의 주소를 알아낼 때는 주소 연산자 &(앰퍼샌드ampersand)를 변수 이름 앞에 붙여서 사용합니다. 

 

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. // your code goes here
  6. int integer;
  7. float flt;
  8. double dbl;
  9.  
  10. cout << "변수 integer의 주소 " << &integer << endl;
  11. cout << "변수 flt의 주소 " << &flt << endl;
  12. cout << "변수 dbl의 주소 " << &dbl << endl;
  13.  
  14.  
  15. return 0;
  16. }
output
변수 integer의 주소 0xbfd4b4c0
변수 flt의 주소 0xbfd4b4c4
변수 dbl의 주소 0xbfd4b4c8

예제를 실행한 결과 16진수로 출력되는 변수들의 주소를 볼 수 있습니다. 
주소를 잘 보면 4바이트 씩 증가하는 것을 볼 수 있습니다. 
int형, float형 4바이트
double형 8바이트

 포인터(pointer)
이렇게 알아낸 주소를 저장하는 특별한 변수가 포인터 입니다. 
포인터 연산자 *를 붙여서 선언할 수 있습니다. 
int *ptr;
int* ptr;
int *p, *r, *h;
모두 가능합니다. 
except int* p, r, h; // p변수만 포인터 선언됨

포인터를 선언할 때에 주의 점은 포인터의 자료형과 변수의 자료형이 일치해야 한다는 것입니다. 예를들어
int num;
int *iPtr; // int형에 맞춰서 선언

<포인터를 이용해서 변수의 주소를 저장하는 예제>
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. int num;
  6. int *iPtr;
  7. iPtr = &num;
  8.  
  9. cout << "변수 num의 주소 " << iPtr << endl;
  10. return 0;
  11. }
output
변수 num의 주소 0xbfa79fac

★ 포인터로 변수의 값을 알아보자
포인터 이름 앞에 *를 붙여주면 포인터에 담긴 주소가 나타내는 기억 공간에 있는 값을 알 수 있습니다.
<포인터가 담고 있는 주소에 저장된 값을 알아내는 예제>
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. // your code goes here
  6. int num = 10;
  7. int *ptr;
  8. ptr = &num;
  9.  
  10. cout << "변수 num의 주소 " << ptr << endl;
  11. cout << "변수 num의 값 " << num << endl;
  12. out << "포인터 ptr이 가리키는 주소에 있는 값 " << *ptr << endl;
  13. // ptr 앞에 *를 붙여서 포인터가 담고 있는 주소의 값을 알수 있습니다.
  14. return 0;
  15. }
 
 
output
변수 num의 주소 0xbfc3c73c
변수 num의 값 10
포인터 ptr이 가리키는 주소에 있는 값 10</pre>
 
 
output을 보면 포인터 ptr이 num가 가지고 있는 값을 나타내고 있습니다. 
 
그럼 포인터가 가지고 있는 값을 변경해보도록 하겠습니다. 
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. int num = 10;
  6. int *ptr;
  7. cout << "변수 num의 현재 값 " << num << endl;
  8.  
  9. ptr = &num;
  10. *ptr = 20;
  11.  
  12. cout << "*ptr에 20을 넣었습니다." << endl;
  13. cout << "변수 num의 값 " << num << endl;
  14.  
  15. return 0;
  16. }

 

output

변수 num의 현재 값 10 *ptr에 20을 넣었습니다. 변수 num의 값 20

 

 

포인터 ptr앞에 *를 붙인 *ptr은 변수 num의 주소에 있는 값이 됩니다. 새로운 값을 넣었으니 변경이 됩니다. 10->20

 

여기까지 포인터에 대한 기본적인 지식이었습니다. 감사합니다.

반응형