본문 바로가기
언어 공부/C++

포인터-1

by 세희홍 2022. 6. 22.

포인터 : 다른 변수의 위치를 가리키는 변수(4bytes)

1. 변수의 타입 뒤에 *를 붙인다.

2. 포인터 변수는 항상 선언하자마자 초기화한다.(포인터 변수에 메모리를 당장 할당하고 싶지 않다면 nullptr로 초기화)

 

int* p = nullptr;

 

int a = 10;
int* pa = &a;

 


void test(int* pn) {
	pn = pn + 1; //포인터 변수의 메모리 주소가 하나 증가(int: 4byte)
	cout << &pn << ' ' << *pn << endl; // 0000002EED0FF950 -858993460. (n의 주소+1(4바이트), 쓰레기값)
}

int main() {
	int n = 10;
	test(&n);
	cout << &n << ' ' <<  n << endl; // 0000002EED0FF974 10

}

pn은 포인터 변수이므로 메모리 번지 주소를 가지고 있다. pn + 1을 하면 주소를 증가시킨 것.

 

void test(int* pn) {
	*pn = *pn + 1; //들어있는 곳의 값 
	cout << pn << " " << *pn << endl; // 0000000BF64FF944 11
}

int main() {
	int n = 10;
	test(&n);
	cout << &n << " " << n << endl; // 0000000BF64FF944 11
}

메모리 번지 주소의 값에 +1을 하고, 메모리 번지 주소는 변경되지 않는다. 함수가 끝나면 포인터 변수가 메모리에서 제거가 되지만 n에 들어 있는 값을 바꿔서 저장한 것이므로 11이 된다.

void plus(int* n) { // int* n = &a;  const int* n = &a;이면 변경 불가
	*n = *n + 5; // const면 변경 불가
	cout << n << &n << *n; // 0095F8AC 0095F7D8 6
}
int main(){
	int a = 1;
	cout << &a << a; // 0095F8AC 1
	plus(&a);
	cout << a; // 6
	return 0;
}

	int arr[5];
	int* p1 = &arr[1];
	int* p2 = &arr[4];

	cout << p1 << endl; // C14
	cout << p2 << endl; // C20
	cout << p2-p1 << endl; // 3

포인터 간의 상수의 덧셈, 뺄셈은 주소끼리 뺀 값이 아니라 간격이 나온다. 

p2-p1은 12bytes이지만 3이 나온다.


const

 

1.  가리키는 대상의 값을 변경 불가(주소 변경 가능)

int a = 10;
int b = 20;
const int* p = &a;

*p = 30; // 에러. const인 변수에 할당할 수 없다.
a = 30;
p = &b; // a의 주소를 가지고 있던 포인터 변수 p에게 b의 주소를 전달

 

2. 가리키는 주소 변경 불가

int a = 10;
int b = 20;
int* const p = &a; // 포인터 p의 주소는 &a의 주소로만 사용가능

*p = 30; // 가리키는 대상 변경.
p = &b; // 에러. 다른 주소로 변경 불가

 

3. 가리키는 대상의 값을 변경 불가 & 가리키는 주소 변경 불가

int a = 10;
int b = 20;
const int* const p = &a; // 포인터 p의 주소는 &a의 주소로만 사용가능. 값 변경 불가

*p = 30; // 에러. 가리키는 대상 변경 불가
p = &b; // 에러. 다른 주소로 변경 불가

 

int score = 92;
int* pScore = &score;
score = 80; // 데이터 변수로 변경
*pScore = 70; // 포인터 변수로 변경

 

const int score = 92;
int* pScore = &score; // 컴파일 오류

 

 

int score = 92;
const int* pScore = &score;
score = 80; // 데이터 변수로 변경
*pScore = 70; // 컴파일 에러

 

const int score = 92;
const int* pScore = &score;
score = 80; // 컴파일 에러
*pScore = 70; // 컴파일 에러

pass by pointer

 

int* larger(int* x, int* y) {
	if (*x > *y)
		return x;
	return y;
}
int main() {
	int x = 10;
	int y = 20;
	int z = *larger(&x, &y);
	int* u = larger(&x, &y);
	cout << z; // 20
	cout << u << *u << y; // BF4 20 20
	return 0;
}

 


void 포인터

short a = 10;
int b = 20;
void* va = &a;
va = &b;
cout << (int*)va  << ' ' << *(int*)va; //00000054CF2FFC44 20
cout << *static_cast<int*>(va); // 20

void 포인터는 어떤 타입의 변수도 다 받을 수 있지만, 출력을 할 때는 타입을 명시해줘야 한다.

 

 

'언어 공부 > C++' 카테고리의 다른 글

메모리 관리  (0) 2022.06.22
포인터-2  (0) 2022.06.22
reference(참조)-2  (0) 2022.06.21
reference(참조)-1  (0) 2022.06.21
클래스와 생성자  (0) 2022.06.20

댓글