C++

[C++ ] 1차원 포인터 정리

Let it out 2024. 1. 25. 05:46

포인터는 C++ 의 꽃이라고 불리며 코딩을 더 편하게 하라고 만든 문법이다.

또한 C++ 을 배웠다면 꼭 알아야 할 개념이니 마스터 하고 넘어갈 것.

 

 

우선 메모리와 메모리 주소 할당 개념에 대해 알아보자.

1. 메모리 주소 할당 개념

우선, 우리가 프로그램을 실행하면 각 변수마다 메모리가 할당된다.

int a; //4byte 메모리 할당
double b; //8byte 메모리 할당

 

 

메모리가 할당 되면 각 변수에 주소들이 배정된다.

아래 예제는 각 변수마다 다른 메모리 주소가 할당 된다는 것을 위한 예시다.

int a; //4byte 메모리 할당, 0x0001 메모리 주소
double b; //8byte 메모리 할당, 0x0100 메모리 주소

 

 

메모리 주소가 배정되는 이유는 컴퓨터가 메모리 주소를 찾아서 변수값을 가져오기 때문이다.

 

 

 


 

주의 할 점은 메모리 주소는 프로그램 재시작시 매번 바뀐다.

메모리 주소가 고정적이지 않다는 것이다.

 

메모리 주소를 확인 해보자.

변수 앞에 &(주소 연산자)을 붙여 변수의 메모리 주소를 확인 할 수 있다.

아래예제를 두 번 실행 시켜보자.

#include <iostream>
using namespace std;

void main()
{
    int num = 100;   // 변수 선언
    int *ptr; // 포인터 선언

    cout << "num 주소: " << &num << endl; //메모리 주소 확인
    cout << "ptr 주소: " << &ptr << endl; //메모리 주소 확인
}

 

 

첫번째 실행

 

 

두번째 실행

 

실행 결과 num, ptr 변수의 메모리 주소가 프로그램을 실행 시킬 때마다 매번 바뀌는 것을 확인 할 수 있다.

변수든 함수든 프로그램 시작 시 메모리 주소를 할당한다는 것을 알고있으면 된다.

자세한 부분은 C++ 메모리 주소를 구글링 해서 찾아볼것.

 

 


 

2.  포인터란?

 

이제 메모리 주소에 대한 개념을 공부 했으니 포인터를 알아보자.

 

자료형 int는 정수값, double은 실수 값을 저장한다.

이처럼, 포인터는 어떤 변수의 메모리 주소값을 저장 한다.

포인터가 저장한 변수의 메모리 주소에 접근하여 해당 변수 값을 사용 할 수 있다.

 

주소 연산자(&) : 변수 앞에 &을 붙여 변수의 주소를 반환.

참조 연산자(*) : 포인터의 앞에 *을 붙여 포인터가 가리키는 주소에 저장된 값을 반환.

 

 

- 포인터에 메모리 주소 저장

포인터 ptr에 num의 메모리 주소를 할당 했다.

이때 포인터 ptr이 변수num의 메모리 주소를 가리킨다고 표현한다.

또한 포인터가 변수를 참조 한다고도 한다.

#include <iostream>
using namespace std;

void main()
{
    int num = 100;   // 변수 선언
    int *ptr; // 포인터 선언
    ptr = &num; // ptr(포인터)가 변수(num)의 메모리 주소를 가리킨다.
}

 

 

- 포인터로 변수 값 출력하기

*ptr을 사용하면 포인터 ptr이 가리키는 num 변수 값을 출력한다.

#include <iostream>
using namespace std;

void main()
{
    int num = 100;   // 변수 선언
    int *ptr; // 포인터 선언
    ptr = &num; // ptr(포인터)가 변수(num)의 메모리 주소를 가리킨다.
    
    cout << "ptr 참조값: " << *ptr << endl; // ptr 참조 값 출력
}
결과 : 100

 

 

 

- 포인터로 변수 메모리 주소 출력하기

*없이 ptr을 그대로 써주면 포인터가 가리키는 변수 메모리 주소가 출력 된다.

#include <iostream>
using namespace std;

void main()
{
    int num = 100;   // 변수 선언
    int *ptr; // 포인터 선언
    ptr = &num; // ptr(포인터)가 변수(num)의 메모리 주소를 가리킨다.
    
    cout << "ptr 참조값: " << ptr << endl; // num 메모리 주소 출력
}
결과 : 0x0000000A

 

 

 

 


 

3. 1차원 포인터 전체 예제

마지막으로 num의 주소, ptr의 주소, ptr이 가리키는 주소, ptr의 참조 값을 출력하는 예제다.

예제를 복붙해서 실행 시켜보고 직접 이해해 볼것.

#include <iostream>
using namespace std;

void main()
{
    int num = 100;   // 변수 선언
    int *ptr; // 포인터 선언
    ptr = &num; // ptr(포인터)가 변수(num)의 메모리 주소를 가리킨다.

    cout << "num 주소: " << &num << endl;
    cout << "ptr 주소: " << &ptr << endl;
    cout << endl;

    cout << "ptr이 가리키는 주소 : " << ptr <<" (num의 주소) " << endl;
    cout << endl;

    cout << "num 값: " << num << endl; // num 값 출력
    cout << "ptr 참조값: " << *ptr << endl; // ptr 참조 값 출력
}

 

 

실행결과

 

 

 

1차원 포인터에 대한 개념은 끝이다.
실무에서는 포인터로 변수 뿐만 아니라 함수, 클래스를 동적 할당 한후

포인터로 사용하는 방법을 많이 사용한다.

 

따라서 C++ 개발자가 목표라면 포인터, 동적 할당 개념을 공부하고

꽤나 큰 프로젝트를 다운받아 어떻게 포인터를 활용하는지 공부하는 것이 필요하다.

또한 포인터에 익숙해지고 사용하다보면 왜 C++ 꽃이 포인터라 불리는지 이해가 될 것이다.

반응형