# 포인터
- 포인터: 메모리 주소를 값으로 갖는 변수
- 간접 참조를 통하여 원본 데이터를 복사하거나 공유할 수 있음
- 메모리 주소를 직접 다루기 때문에 잘못 사용할 경우 예기치 못한 상황으로 시스템이 다운되거나 문제가 발생할 수 있음
- 함수 간의 매개 변수 참조 전달(call by reference), 연결 리스트에서 동적 메모리 관리(dynamic memory management) 등에 사용됨
- *(asterisk)와 &(ampersand) 연산자
> *은 사용되는 위치에 따라 의미가 달라지며 포인터형 변수에만 적용 가능
→ 아래 소스코드 (1), (2), (3), (4) 참고
> &는 모든 변수에 붙일 수 있는 주소 연산자
[코드]
#include<stdio.h>
void main() {
int i = 3, j;
int *p; // (1) *을 사용하여 정수 포인터형 변수를 선언
p = &i; // (2) i의 주소를 포인터 p에 할당
j = *p; // (3) 포인터 p가 참조하고 있는 주소 공간에 저장된 값을 j에 할당
j = j + 1;
*p = j * 2; // (4) j의 값에 2를 곱한 뒤 결과 값을 p가 참조하고 있는 주소 공간, 즉 변수 i에 저장
printf("i=%d, j=%d, *p=%d, &p=%u\n", i, j, *p, &p);
}
[포인터 연산 결과]
15727736 | 8 | i |
15727740 | 4 | j |
15727744 | ||
15727748 | 15727736 | p |
[실행결과]
> &p 즉, 주소 값은 실행되는 컴퓨터에 따라 다른 값이 출력될 수 있음
# 포인터의 전달
- 예시: 변수 i의 주소를 포인터에 할당한 뒤 pointer 함수에 전달하는 예제
> pointer 함수 호출문에서 포인터 p가 참조하는 값(*p)과 변수 j의 주소를 전달
> pointer 함수 안에서 (*q)를 통하여 포인터 q가 참조하는 대상의 원본 값도 변경됨
[코드]
#include<stdio.h>
void pointer(int i, int *q);
void main() {
int i = 5, j;
int *p;
p = &i;
j = (*p) + 1;
pointer(*p, &j);
p = &j;
printf("%d %d %d\n", i, j, *p);
}
void pointer(int i, int *q) {
i++;
*q = (*q) + 1;
printf("%d %d\n", i, *q);
}
[실행결과]
'Study > Data Structure' 카테고리의 다른 글
[DS] 볼링 게임 점수 계산 구현 (0) | 2021.08.25 |
---|---|
[DS] Array (배열) & Multi-Dimensional Array (다차원 배열) (0) | 2021.08.25 |
[DS] 구조체 (0) | 2021.08.25 |
[DS] 자료구조 개념 및 구현 Chapter 1 연습문제 (0) | 2021.08.25 |
[DS] Huffman Coding Tree (허프만 코딩 트리) (0) | 2021.08.25 |