주소 연산자와 포인터 연산자

주소 연산자 &

  • & 는 주소 연산자이다.
  • 이 연산자는 변수의 주소를 반환한다.
1
2
3
4
void address_operator() {
  int num = 10;
  printf("address of num : %p\n", &num)
}
1
0x12dcf624c

참조(포인터) 연산자 *

  • *는 참조(포인터) 연산자이다.
  • 이 연산자는 포인터가 가리키는 메모리를 참조(접근)하는 연산을 수행
  • 즉, 간접 참조(dereference, 역참조)를 발생시킨다.
1
2
3
4
5
6
void pointer_operator() {
  int num = 20;
  int *p = #
  printf("*p : %d\n", *p);
  printf("p  : %p", p);
}
1
2
*p : 20
p  : 0x12dcf624c
  • 여기서 잘 이해를 해야한다.
  • 먼저, 포인터 자체는 메모리 주소를 저장하고 있다.
1
2
printf("p : %p", p);
// 출력 : p : 0x12dcf624c
  • 그리고 포인터 연산(*)을 하면 해당 변수에 저장된 값에 해당하는 메모리 주소에 접근하게 된다.
1
2
3
printf("*p : %d", *p);
// 즉, *0x12dcf624c
// 출력 : *p : 20
코드 설명
int *p = 주소값; 포인터 변수 p의 메모리 주소에 접근해 주소값을 저장
p 위 식을 통해 포인터 변수 p에 담긴 주소값
*p 포인터 변수 p가 담고 있는 메모리 주소, 그 주소에 저장된 값
1
2
3
4
5
6
| variable |   address   |    value    |
| -------- | ----------- | ----------- |
|    num   | 0x12aee284c |      20     | *p
|    ...   |     ...     |     ...     |
|     p    | ??????????? | 0x12aee284c |
|    ...   |     ...     |     ...     |

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments