C++ 포인터 이해

C++/C++ 문법 2019. 11. 30. 11:50
728x90

C++ 포인터에 대한 이해를 얼마나 하고 있는지 복습하는 예제다.

포인터형 변수는 16진수로 표기된다.

cout << " x = " << x << ", x 주소 : " << (uintptr_t)&x << endl;

포인터 주소를 10진수로 출력되도록 하려면 uintptr_t 로 형변환을 하면 된다.


 - 포인터는 변수다.

 - C언어 및 C++ 언어에서는 주소도 데이터다.

 - 포인터 변수는 메모리 번지를 저장한다.

 - 자신의 자료형과 같은 주소를 값으로 갖는다.

 - 포인터의 크기는 자료형에 상관없이 4bytes이다.


int a = 100; // 변수의 선언, 자료형 변수 = 값;
int* ptr; // 포인터의 선언
ptr = &a; // 주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환


주소 연산자(&)
주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.
'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 주소 연산자 또는 번지 연산자 라고 불린다.


역참조 연산자(*)
역참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터가 가리키는 주소에 저장된 값을 반환한다.


포인터 선언

int* ptr; // 올바른 예

int* ptr1, ptr2; // 잘못된 예

int *ptr1, *ptr2; // 올바른 예

두개 이상의 int형 포인터를 선언하고 싶을 때에는 각각의 포인터 변수 이름 앞에 역참조 연산자(*)를 따로 사용하여 선언해야 한다.


int a = 7;         // 변수의 선언
int* ptr = &a;     // 포인터의 선언 및 주소 할당

// 자료형 변수 = 값;

// 자료형 : int*, 변수 : ptr, 값:&a

// ptr도 변수이므로 &ptr 즉 주소를 갖는다.
int **pptr = &ptr; // 더블 포인터 : 포인터의 포인터


예제1

#include <iostream>
using namespace std;

int main() {
    // 주소 연산자(&) : 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.
    // 역참조 연산자(*) : 포인터의 이름이나 주소 앞에 사용하여, 포인터가 가리키는 주소에 저장된 값을 반환한다.

    int a = 10, b = 20, c = 30;
    cout << endl << " a = " << a << ", b = " << b << ", c = " << c << endl;


    int* p = &a; // 포인터 선언 및 a 변수의 주소 할당
    cout << endl << " *p = " << *p << " // 포인터 p → a " << endl;
    cout << " a = " << a << endl;

    int &r = b; // 참조변수 선언 및 b 변수 할당
    cout << endl << " r = " << r << " // reference r → b" << endl;
    cout << " b = " << b << endl;

    int** pp = &p; // 더블 포인터 : p 포인터의 포인터
    cout << endl << " **pp = " << **pp << " // 포인터 p → a " << endl;
    cout << " a = " << a << endl;

    int* (&rp) = p; // p 포인터에 reference 변수 rb 선언
    cout << endl << " *rp = " << *rp << " // reference rp → p포인터 p → a " << endl;
    cout << " a = " << a << endl;

    r = c / *p;
    cout << endl << " r = " << r << " // reference r → b " << endl;
    cout << " b = " << b << endl;

    rp = &c; // rp 즉 p 포인터 변수에 c변수 주소 할당
    cout << endl << " *rp = " << *rp << " // reference rp → p → c " << endl;
    cout << " c = " << c << endl;

    **pp = 40;
    cout << endl << " **pp = " << **pp << " // 포인터 p → c " << endl;
    cout << " c = " << c << endl;

    *p = 50;
    cout << endl << " *p = " << *p << " // 포인터 p → c " << endl;
    cout << " c = " << c << endl;

    *pp = &a;
    cout << endl << " **pp = " << **pp << " // 포인터 p → a " << endl;
    cout << " a = " << a << endl;

    *rp = 60;
    cout << endl << " *rp = " << *rp << " // reference rp → p, 포인터 p → a  " << endl;
    cout << " a = " << a << endl;

    cout << endl << "***** 결과 출력 *****" << endl;
    cout << " a = " << a << endl;
    cout << " b = " << b << endl;
    cout << " c = " << c << endl;
    cout << " *p = " << *p << endl;
    cout << " r = " << r << endl;
    cout << " **pp = " << **pp << endl;
    cout << " *rp = " << *rp << endl;
}

실행결과



참고하면 좋은 자료

C언어 포인터 인강 ② 포인터 때문에 미쳐 버릴 것 같은 당신께 https://www.youtube.com/watch?v=LtmJm068muw&t=31s

728x90
블로그 이미지

Link2Me

,