반도체/C++

5. 공부목적 C++ 포인터 (2)

Clair_de_Lune 2024. 7. 17. 13:47
728x90

 

 

포인터 , 메모리 해제 (1),(2),포인터 연산



int val = 3 ;



이 변수를 선언할 때 저희가 어떤 식으로 변수를 선언을 했죠
먼저 이 변수에 사용될 변수의 데이터 형과 저희가 변수의 이름으로 사용할 변수의 기호

이름을 이 프로그래밍에 제공해주게 되면 이 프로그램들은 저희의 눈에는 보이지 않지만 그
값을 저장하기 위한 메모리를 대입하게 되고 그 위치를 내부적으로 추적할 수 있게 됩니다

그렇게 프로그램이 내부적으로 메모리를 대입한 공간이 저희들이 주소라고 부르는 공간입니다


16진수 표기가 메모리를 나타내는 가장 일반적인 방법이기 때문에 보통의 주소출력은 16진수




이 객체 지향 프로그래밍에 가장 큰 특징 중 하나는 컴파일 시간이 아닌 실행 시간에 어떠한
결정을 내릴 수 있다는 점입니다



시간인 컴파일 시간에 어떤 모든 것이 결정되는 게 아니라 코드가 실행돼서
 돌아가고 있는시간 동안에 우리가 어떤 결정을 내릴 수 있는 게 객체지향 프로그래밍의 가장 큰 특징 중 하나



이 재례적 절차적 프로그래밍에서는 배열의 크기가 미리 결정되어야 배열을 사용할 수 있습니다
하지만 객체 지향 프로그래밍에서는 배열의 크기를 실행 시간에 결정할 수 있습니다



즉 다시 말하여서 재례적 절차적 프로그래밍에서는 배열의 크기가 컴파일 시간에 미리
결정되어야 하지만 객체 지향 프로그래밍에서는 실행시간, 즉 프로그램이 실행되고 있는 시간에 배열의 크기를 결정할 수 있다는 것입니다.


저희가 변수, 값이 변할 수 있는 변수로 배열의 크기를 결정할 수 있다는 말로도 해석할 수 있다.




변수 선언 과정을 잠깐 되짚어볼 때 프로그램은 저희가 변수를 선언하게 되면 내부적으로
메모리 라는 곳에 주소라는 공간으로 그 값을 저장한다.

포인터 사용할 주소에 이름을 붙인다.
즉, 포인터는 포인터의 이름이 주소를 나타낸다.
구형을 위해서는 간접값 연산자, 간접 참조 연산자


int   *a; // c Style
 

int*   a; // c++ Style

int*  c,d ;
// c는 포인터 변수 , d는 int형 변수


#include <iostream>

using namespace std;

int main(){

    int a = 6;
    int* b;

    b = &a;

    cout << "a의 값 " << a << endl;
    cout << "*b의 값 " << *b << endl;

    cout << "a의 주소 " << &a << endl;
    cout << "*b의 주소 " << b << endl;

    *b = *b + 1;

    cout << "이제 a의 값은 " << a << endl;
     
    return 0
}



결론적으로 말해서 포인터에는 어떠한 정수를 대입하는 것이 아무런 의미가 없습니다
다만 제가 보여드렸던 예시처럼 어떤 변수의 주소를 대입함으로써 그 포인터를 이용해서
 그 주소의 값에 변화를 주어서 그 값을 수정하게 하는 게 가능합니다



지금의 경우에는 이 포인터를 어떤 변수의 주소의 값으로 초기화한 경우가 됩니다



 [포인터의 쓸모]

프로그램을 실행하는 동안에 이름이 없는 메모리 즉 아직 결정되지 않은 메모리를 대입할 수 있다 라는 그 점이 포인터의 진정한 쓸모입니다

그것이 바로 저희가 다음 시간에 살펴볼 New 연산자입니다.

728x90