포인터 : 다른 변수의 위치를 가리키는 변수(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 |
댓글