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가 들어가게 되죠.
'공부하자 > C언어' 카테고리의 다른 글
C언어 문법 공부 8장 [다시 한 번 포인터에 대해 정리] (0) | 2016.11.20 |
---|---|
C언어 문법 공부 8장 [포인터에 초기값 설정] (0) | 2016.11.20 |
C언어 문법 공부 8장 [포인터는 어떻게 선언하는가] (0) | 2016.11.20 |
C언어 문법 공부 8장 [포인터란] (0) | 2016.11.20 |
C언어 문법 공부 7장 [for문] (0) | 2016.11.20 |