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

주소 연산자 &

  • & 는 주소 연산자이다.
  • 이 연산자는 변수의 주소를 반환한다.
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 |
|    ...   |     ...     |     ...     |

포인터의 주소 예시

1
2
3
4
5
6
7
8
9
10
void add_and_pointer(){
    int num = 20;
    int *p = &(num);
    printf("num  : %-12d // num 의 값\n", num);
    printf("p    : %-12p // num 의 주소값\n", p);
    printf("*p   : %-12d // num 의 주소에 저장된 값\n", *p);
    printf("&p   : %-12p // p의 주소값\n", &p);
    printf("*&p  : %-12p // p의 주소값에 해당하는 메모리에 담긴 값\n", *&p);
    printf("**&p : %-12d // p의 주소값에 해당하는 메모리에 담긴 값(주소)에 해당하는 메모리에 담긴 값\n", **&p);
}
1
2
3
4
5
6
num  : 20           // num 의 값
p    : 0x12aee284c  // num 의 주소값
*p   : 20           // num 의 주소에 저장된 값
&p   : 0x42ace3241  // p의 주소값
*&p  : 0x12aee284c  // p의 주소값에 해당하는 메모리에 담긴 값
**&p : 20           // p의 주소값에 해당하는 메모리에 담긴 값(주소)에 해당하는 메모리에 담긴 값
1
2
3
4
5
6
| variable |   address   |    value    |
| -------- | ----------- | ----------- |
|    num   | 0x12aee284c |      20     |
|    ...   |     ...     |     ...     |
|     p    | 0x42ace3241 | 0x12aee284c |
|    ...   |     ...     |     ...     |

Reference

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

Comments