소프트웨어 개발/C

(1) C++ 기본 빠르게 익히기 - 포인터

늘근이 2017. 8. 5. 17:43

- 포인터

일반적으로 언어에서 int, float와 같은 기본자료형들은 값으로 움직이고 객체등은 참조값으로 움직입니다. = 연산자를 통해 같다고 선언하면, 기본자료형들은 그 당시에만 값이 똑같이 바뀌지 같은 값을 바라보고 있는것은 아닙니다.

C에서는 기본자료형들도 포인터나 참조자등을 통해 쉽게 두 경계를 넘나들수 있습니다. 즉 var a = 1이라고 선언했을때 1을 가르키고 있는 주소값으로 포인터연산등이 가능해집니다.

#include <stdio.h>

void swapByRef(int * num1, int * num2) {
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}

void swapByValue(int num1, int num2) {
int temp = num1;
num1 = num2;
num2 = temp;
}

void swapByRef2(int &ref1, int &ref2) {
int temp = ref1;
ref1 = ref2;
ref2 = temp;
}

int main() {
int a = 1;
int b = 2;

swapByValue(a,b);
printf(" value swap: %d %d",a,b);

swapByRef(&a,&b);
printf(" ref1: %d %d",a,b);

swapByRef2(a,b);
printf(" ref2: %d %d",a,b);

return 0;
}

결과)

value swap: 1 2 ref1: 2 1 ref2: 1 2

함수안에서 아무리 값을 지지고 볶아봤자 지역변수는 return이 되지 않는이상에는 외부세상에 영향을 미칠수가 없습니다. 보통의 언어가 이렇습니다.

그렇지만 C++은 메모리가 참조되는곳으로 기어들어가 값을 바꿉니다. 1을 넣으면 2가 튀어나와야하는데, 사실 이렇게 포인터를 남발하는것은 보나마나 나중에 골치아플것이 예상되며, 함수 안에서는 '부수효과'를 내면서까지 내부상태를 바꾸는점은 섹시하지 못합니다. 아마 같이 코딩하는 분께 한소리 들을지도 모릅니다. 어쨌든 C의 꽃은 포인터라고 하니 넘겨짚고 갑니다.

포인터는 그럼 뭘담고 있어야 할까요.

int num = 12;

이렇게 선언하고

int num2 = num;

이렇게 선언하면 둘다 12가 되는건 뻔할뻔자입니다.

num = 100;

그런데 num에 들어가있는 12라는 값을 100으로 바꾸면 num은 100이고 num3는 12가 유지됩니다.

100
12

둘의 연결은 존재하지 않기 때문이죠. 그런데 포인터를 이용해 주소를 찾아들어가면 둘다 모조리 바뀝니다.

이제 포인터를 써봅니다.

int num = 12;
int * num2 = num;
num = 100;

컴파일에러납니다. 포인터는 주소값을 들고있어야합니다.

&를 이용해 주소값으로 넣어줘봅니다.

int num = 12;
int * num2 = &num;
num = 100;

 

100
38075864

응? 숫자가 큽니다. 주소값을 출력해버리네요. 왜냐면 출력을 num2를 열심히 하고있는데, num2는 포인터라 아래와같이 *로 출력합니다.

printf("---------------------------\n");
printf("%d\n", num);
printf("%d\n", *num2);

 

---------------------------
100
100

 

포인터 포인터 신나는노래~