C 언어 개열/C++

포인터(Pointer) 변수와 레퍼런스(Reference) 변수의 이해

본클라쓰 2010. 8. 19. 22:41


 포인터란 메모리의 주소를 가리키는 변수로 32비트 환경에서 4바이트의 크기를 가진다. 포인터는 주소(Address)와 타입(Type)으로 구성되며 특별한 연산자를 사용하여 접근한다.

 

포인터 연산자

  • * (Dereference Operator)
  • & (Address of Operator)

 

 포인터를 사용하면 메모리에 접근하는 프로그래밍이 가능하기 때문에 Low-Level 프로그래밍이 가능하게 한다. 하지만 잘못 사용하면 매우 위험한 코드가 된다.

 

int x = 10;

int y = 20;

 

fun(&x, &y)

 

void fun(int *x, int *y) {

    int temp;

    temp = *x;

    *x = *y;

    *y = temp; 

 

 변수란 메모리 공간에 붙은 이름이다. 즉, 변수는 메모리가 할당되는 공간에 이름을 붙인 것으로, 레퍼런스 변수는 이 할당된 공간에 이름을 하나 더 추가 시키는 것이다.

int val = 10;
int &ref = val;


아래의 코드를 보자.

#include <iostream>

using std::cout;
using std::endl;

int main() {

    int val = 10;
    int &rVal = val;    // 레퍼런스 선언을 위해 & 연산자를 사용

    val++;
    cout << "val = " << val << endl;
    cout << "ref = " << rVal <<endl;

    rVal++;
    cout << "val = " << val << endl;
    cout << "ref = " << rVal << endl;

    cout << "val address = " << &val << endl;
    cout << "ref address = " << &rVal << endl;

    return 0;

}


[ 위의 코드 결과값 ]

val = 11
ref = 11
val = 12
ref = 12
val address = 0x22ff24
ref address = 0x22ff24


위의 결과처럼 레퍼런스 변수는 같은 메모리 주소를 참조하고 데이터 또한 똑같이 변경할 수 있다. 즉, 레퍼런스 변수는 같은 공간에 할당한 이름을 추가한 것이다.




레퍼런스 변수의 제약

  1. 선언과 동시에 초기화되어야 한다.
  2. 이름이 존재하지 않는 대상에 레퍼런스 할 수 없다.   ex) int &ref = 10; (x)


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

C++ 객체지향 기초  (0) 2010.08.22
Call by Value 와 Call by Reference  (0) 2010.08.22
const 키워드와 메모리 영역  (0) 2010.08.19
using 키워드와 전역변수 접근방법  (0) 2010.08.19
이름공간(Namespace)   (0) 2010.08.19