기록장

[C++][자료구조] 포인터 개념정리 본문

코딩 공부/C++

[C++][자료구조] 포인터 개념정리

민j 2023. 4. 3. 03:43
정수 변수 정수 저장 int a;
포인터 변수 주소 저장 int* p;

 


<포인터 선언>

  • 포인터 변수 선언
int* pi;		// int 변수의 메모리 위치를 알려주는 포인터 pi선언
float *pf;		// float 변수의 메모리 위치를 알려주는 포인터 pf선언

 

  • 여러 개의 포인터 변수 선언
char* p, q, r;		// p는 char* 변수, q와 r은 char 변수
char *p, *q, *r;	// p, q, r 모두 char* 변수

 

* 사용하기 전에 반드시 초기화되어야 함

 


<다양한 포인터>

int *pi; pi는 정수 변수를 가리키는 포인터
float *pf; pf는 실수 변수를 가리키는 포인터
char *pc; pc는 문자 변수를 가리키는 포인터
test *ps; test 타입의 객체를 가리키는 포인터
void *p; p는 void type의 포인터

 

  • 포인터 형 변환
void *p;
int* pi = (int*)p;

 


<*연산자>

예시:

아래 표와 같은 포인터와 변수가 있다

  int* pi int i
내용 0xFE00 20
주소 0x8B00 0xFE00
&연산자 : 변수의 주소
* 연산자 : 포인터가 가리키는 곳의 내용(변수의 내용)

 

int i = 20;
int *pi;
pi = &i;

cout << *pi << endl;	// *연산자(변수의 내용) 출력: 20
cout << pi << endl;		// 포인터의 내용, 출력: 0xFE00
cout << &pi << endl;	// &연산자(변수의 주소) 출력: 0x8B00

 

예시2

int a = 10, b = 4;

int* p, * q;
p = &a;
q = &b;

*p = 8;					// *p == a의 내용 = 8
*q = *p + 2;			// *p == b의 내용 = a의 내용 + 2

cout << *q << endl;		// 출력: 10

 


<포인터 연산자>

  int* pi int i
내용 0xFE00 20
주소 0x8B00 0xFE00
p 포인터 변수
*p 포인터가 가리키는 값 (변수(i)의 내용)
(*p)++ 포인터가 가리키는 값을 증가 (변수(i)의 내용 증가)
*p++  p++ 포인터 변수 증가 (주소 증가)
*p-- p-- 포인터 변수 감소 (주소 감소)

예시

#include <iostream>
using namespace std;

int main() {
	int i = 10;
	int* p = &i;
	// 1
	cout << "*p " << *p << " " << p << endl;

	// 2
	*p++;
	cout << "*p++ " << *p << " " << p << endl;

	// 3
	*p--;
	cout << "*p-- " << *p << " " << p << endl;

	// 4
	(*p)++;
	cout << "(*p)++ " << *p << " " << p << endl;

	return 0;
}

 

나는 setw() 사용해서 값이 조금 더 잘 보이게 정렬했다. 위의 코드로 실행하면 약간 다름 (값은 같음)

*p == i의 내용
p == p의 내용 == 변수의 주소

이다

 

~설명~

// 1

*p는 10이다. p는 i의 주소이다

 

// 2

*p++; 로 인해 p의 내용, 즉 i의 주소였던 값이 바뀌었다. 따라서 p가 가리키는 변수가 더이상 i가 아님.

출력 사진에서 *p++ 옆을 보면 숫자가 10에서 완전히 다른 값으로 바뀌었다.

 

// 3

*p--; 로 p의 내용, 즉 주소값이 다시 i의 주소로 돌아왔다. 

따라서 *p가 i의 내용인 10이 됨.

 

// 4

(*p)는 i의 내용이다. i의 내용(*p)가 10에서 11이 되었음을 알 수 있다.