공부하자/C언어

C언어 문법 공부 8장 [포인터 연산자]

YoBot 2016. 11. 20. 19:30

3. 포인터 연산자


C언어 에서는 포인터 사용시에 사용하는 연산자가 2가지가 있습니다. 그 두가지는 기존의 비트별 논리곱 연산자인 &와 곱셈 연산자인 *입니다.

포인터 연산자로 쓰일때 &는 주소 연산자라고 하고, *는 참조 연산자라고 합니다. 


(1) 주소 연산자

주소 연산자란 어떤 변수의 주소를 얻는 연산자를 말합니다.

사용법은 주소를 얻고자 하는 변수의 앞에 &를 붙여 주기만 하면 됩니다.


그러니까


포인터 = &변수;


이렇게 하면 변수의 주소가 포인터에 들어가죠.


예를 들어


int Variable=10;

int *Pointer;


이렇게 두 변수를 선언했다고 할때,


Pointer = &Variable;


이렇게 해 주면 Variable라는 변수의 주소가 Pointer라는 변수로 들어갑니다.


이것을 실제 메모리 상의 구조를 통해 다시한번 살펴보죠.


처음에


int Variable=10;


int *Pointer; 


이렇게 변수를 선언할 당시는 

변수이름 | Variable Pointer


주소 | 1 2 3 4 . . .


------------------------------------------------------------

값 | 10 ? ? ? 

다음과 같은 메모리 구조를 갖습니다.


여기서 Variable라는 변수는 실제 메모리 주소 1을 할당받았다고 하고, Pointer라는 변수는 실제 메모리 주소 3을 할당받았다고 합시다. 

다음에


Pointer = &Variable; 

이렇게 하면 Pointer라는 변수에 Variable의 주소인 1이 들어가서 

변수이름 | Variable Pointer


주소 | 1 2 3 4 . . .


------------------------------------------------------------

값 | 10 ? 1 ? 

이렇게 됩니다. 


(2) 참조 연산자

포인터는 주소를 기억시키는 변수라는 것을 이미 배웠습니다.

그렇다면 그 기억시키고 있는 주소에 기억되어 있는 값을 사용하거나 다른 값으로 바꿀땐 어떻게 할까요? 그때 참조 연산자인 *를 사용 합니다.


사용법은 

*포인터 = 값;


변수 = *포인터; 

이런 식으로 사용하죠.


첫번째의 경우 포인터에 저장되어 있는 주소에 값을 넣어 줌니다.


두번째의 경우는 포인터에 저장되어 있는 주소에 기억되어 있는 값을 변수로 넣어 주게 되겠죠?


예를 들어..


int Var1=10, Var2;


int *Pointer;


이렇게 세개의 변수를 선언했고, 

Pointer = &Var1; 

이렇게 Pointer에 Var1의 주소를 넣었다고 합시다.


이때 

*Pointer=5; 

이렇게 해 주면 Pointer에 저장되어 있는 주소 즉


Var1이라는 변수의 주소에 5를 넣어 주므로 결국에는 Var1은 5가 됩니다.


그 다음으로 

Var2=*Pointer;


이렇게 했다면 Pointer에 저장되어 있는 주소에 들어있는 값,

즉 Var1라는 변수의 주소에 들어있는 값인 5가 Var2에도 들어가

Var1, Var2가 모두 5가 되죠.


이걸 실제 메모리 구조를 보며 다시한번 살펴 볼까요?


처음에


int Var1=10, Var2;


int *Pointer;


이렇게 세개의 변수를 선언할 당시는 

변수이름 | Var1 Var2 Pointer


주소 | 1 2 3 4 . . .

------------------------------------------------------------

값 | 10 ? ? ? 

다음과 같은 메모리 구조를 갖는데,


여기서 Var1라는 변수는 실제 메모리 주소 1을 할당받았고, Var2라는 변수는 실제 메모리 주소 2를, Pointer라는 변수는 메모리 주소 4을 할당받았다고 합시다.


이때 

Pointer = &Var1; 

이렇게 Pointer라는 변수에 Var1의 주소인 1을 넣어주면 

변수이름 | Var1 Var2 Pointer


주소 | 1 2 3 4 . . .

------------------------------------------------------------

값 | 10 ? ? 1 

이렇게 되겠죠?


그리고 다음으로 

*Pointer=5; 

이렇게 해 주면 Pointer에 기억되어 있는 주소 즉 1이라는 주소에 5를 넣어 주어 

변수이름 | Var1 Var2 Pointer


주소 | 1 2 3 4 . . .

------------------------------------------------------------

값 | 5 ? ? 1 

이렇게 됩니다. 그러므로 Var1의 값은 5로 바뀌게 됩니다.


마지막으로


Var2=*Pointer; 

이렇게 하면 Pointer에 저장되어 있는 주소 즉 1이라는 주소에 들어있는 값인 5가 Var2에도 들어가 

변수이름 | Var1 Var2 Pointer


주소 | 1 2 3 4 . . .

------------------------------------------------------------

값 | 5 5 ? 1 

이렇게 Var1과 Var2에 모두 5가 들어가게 되죠.