Study/Object-Oriented

포인터_기본

__PS 2022. 6. 13. 19:50
728x90

C++ 공부 중 포기하게 될 뻔한 두 번째 단계.

여러 강의도 찾아보고 책도 읽어가며 나름 열심히 정리했다.

그 중 가장 이해하기 쉬웠던 강의

https://www.youtube.com/watch?v=nQEvGgt1HZ8

-양주종의 코딩스쿨 중 "C언어 포인터 인강 ① 포인터 때문에 미쳐 버릴 것 같은 당신께 포인터는 넘어설 수 있습니다. 한 번에 이해하기 어렵다면 정상입니다. 반복해서 보시길 권합니다."

 

아직 완벽히 이해했다고 감히 말할 수는 없지만 그래도 처음 접했을 때보다는 많이 알게 되었다.

int a = 20;

int* p = &a;

이 선언과 동시에 아래의 메모리가 할당된다.

20      

바로 위 그림은 a의 메모리를 그림으로 표현한 것이고 a의 시작 주소를 가리키는 것이 포인터이다.

a의 주소값을 쉽게 100번지라고 부르면,

a = 20

&a = 100번지

p = 100번지를 가리키게 된다.

 

*p = 20을 의미하는데, 이는 p에 저장된 주소로 찾아 들어가 값을 찾는다는 것을 의미한다.

쉽게 말해 a 는 int 자료형을 저장하고, p는 int* 자료형을 저장한다. int* 역시 자료형으로 보는 것이 이해하는데 더 도움이 되었다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
using namespace std;
int main() {
    int a = 30;
    int* p = &a;
 
    cout << a << " " << &<< "\n";
       // 30 a의 주소값
    cout << *<< " " << p << " " << &<< "\n";
    // 30 a의 주소값 p의 주소값
    
    a = 40;
 
    cout << a << " " << &<< "\n";
    // 40 a의 주소값 (위의 주소값과 변화 X)
    cout << *<< " " << p << " " << &<< "\n";
    // 40 a의 주소값 p의 주소값 (위의 주소값과 변화 X)
 
    *= 50;
 
    cout << a << " " << &<< "\n";
    // 50 a의 주소값 (위의 주소값과 변화 X)
    cout << *<< " " << p << " " << &<< "\n";
    // 50 a의 주소값 p의 주소값 (위의 주소값과 변화 X)
    
    int b = 100;
    p = &b;
 
    cout << b << " " << &<< "\n";
    // 100 b의 주소값
    cout << *<< " " << p << " " << &<< "\n";
    // 100 b의 주소값 p의 주소값 (p의 주소값은 위의 주소값과 변화 X)
 
    *= 150;
 
    cout << a << " " << &<< "\n";
    // 50 a의 주소값 (위의 주소값과 변화 X)
    cout << b << " " << &<< "\n";
    // 150 b의 주소값 (위의 주소값과 변화 X)
    cout << *<< " " << p << " " << &<< "\n";
    // 150 b의 주소값 p의 주소값 (위의 주소값과 변화 X)
}
cs

 

위의 결과 값 중 주소값은 변하지 않는 이유는 새로운 메모리를 할당하는 것이 아닌 해당 주소의 값만 변하기 때문이다.