포인터 연산

개념

  • 포인터 값은 주소이므로 연산을 통해 주소 변경이 가능하다.
  • +, -, ++, -- 연산이 가능하다.
  • 포인터를 1만큼 증/감 하면 실제 주소는 자료형의 크기만큼 증/감한다.

예시

1
2
3
4
5
6
7
8
9
10
int a = 10;
char c = 'a';
int *p = &a;
char *q = &c;
printf("address of a   : %p\n", p);
printf("address of b   : %p\n", q);
p++, q++;
printf("------ after ++ ------\n");
printf("address of a++ : %p\n", p);
printf("address of b++ : %p\n", q);
1
2
3
4
5
6
# 출력
address of a   : 0x100
address of b   : 0x200
------ after ++ ------
address of a++ : 0x104
address of b++ : 0x201
  • 위 예시에서 pointer p 는 int 자료형의 크기(4byte)만큼 증가한다.
  • pointer q 는 char 자료형의 크기(1byte)만큼 증가한다.
1
2
3
4
5
6
7
| address | pointer |
|   0x100 |   *p    |
|   0x104 |  *p + 1 |

| address | pointer |
|   0x200 |   *q    |
|   0x201 |  *q + 1 |

포인터 정리하기

  • 포인터는 어떤 자료가 저장된 메모리의 주소를 저장하는 변수다.
  • 포인터에 저장된 주소를 통해 해당 주소의 메모리에 저장된 값에 간접 접근한다.
  • 변수의 주소는 ‘&’ 연산자를 사용해 얻는다.
  • 포인터에 저장된 주소의 메모리의 값에 접근할 때는 ‘*’ 연산자를 사용한다.
  • 포인터는 반드시 초기화되어야 하며 초기화되지 않으면 예기치 않은 동작이나 데이터 손상이 발생한다.
  • 포인터가 가리키는 대상의 자료형은 포인터의 자료형과 일치해야 한다.
  • void* 포인터는 특정 자료형이 정해지지 않은 범용 포인터로 어떤 자료형의 주소든 저장할 수 있다.
  • 단, void* 포인터는 사용할 때 반드시 타입 캐스팅을 해야한다.
  • 포인터는 ‘+’, ‘-‘, ‘++’, ‘–’ 같은 연산을 사용해 참조하는 메모리 위치를 이동할 수 있다.

Reference

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

Comments