Fascination
article thumbnail
Published 2021. 8. 25. 22:44
[DS] Pointer (포인터) Study/Data Structure

# 포인터

- 포인터: 메모리 주소를 값으로 갖는 변수

- 간접 참조를 통하여 원본 데이터를 복사하거나 공유할 수 있음

- 메모리 주소를 직접 다루기 때문에 잘못 사용할 경우 예기치 못한 상황으로 시스템이 다운되거나 문제가 발생할 수 있음

- 함수 간의 매개 변수 참조 전달(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);
}

 

[실행결과]

 

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!