728x90

C/C++언어에서 포인터(pointer)는 메모리의 주소를 저장하는 변수이며, 포인터 변수라고 부른다.

char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장하는 데 사용된다.


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


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


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


포인터 선언

int* ptr; // 올바른 예

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

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

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


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


#include <stdio.h>

int main() {
    // 포인터(pointer) : 메모리의 주소를 저장하는 변수
    // 주소 연산자(&)와 역참조 연산자(*)
    // C++의 포인터는 본질적으로 안전하지 않으므로 부적절하게 사용시 응용 프로그램을 손상시키기 쉽다.

    int a = 20;
    int b = 10;

    int* ptr; // 포인터 변수 선언

    ptr = &a; // a 변수의 주소 할당

    printf("a의 값 : %d\n", a);
    // 주소에 %d 를 하면 경고 메시지를 출력하면서 %p를 사용하라고 나온다.
    printf("a의 주소값 : %p\n", &a); // 변수의 주소를 얻으려면 주소 연산자(&)를 사용한다
    printf("ptr에 저장된 값 : %p\n", ptr);
    printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr); // 역참조 연산자 *를 통해 포인터가 가리키는 주소의 값을 알 수 있다

    ptr = &b; // b변수의 주소값
    printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr); // 역참조 연산자 *를 통해 포인터가 가리키는 주소의 값을 알 수 있다
    printf("b의 값 : %d\n", b);

    *ptr = 30;
    printf("b의 값 : %d\n", b);

    printf("\n*****************\n\n");

    int** ptr_ptr;
    ptr_ptr = &ptr;

    printf("b의 값 : %d\n", b);
    printf("b의 주소값 : %p\n", &b);

    printf("ptr에 저장된 값(=주소) : %p\n", ptr);
    printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr);

    printf("ptr_ptr에 저장된 값 : %p\n", ptr_ptr);
    printf("**ptr_ptr이 가리키는 변수에 저장된 값 : %d\n", **ptr_ptr);

    printf("\n*****************\n\n");
    // 배열과 포인터의 관계

    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

    printf("arr의 값 : %p\n", arr); // arr[0] 의 주소값을 반환한다.
    // 배열 변수는 마치 포인터인 것처럼 배열의 첫 번째 요소의 주소를 갖고 있다.

    for (int i = 0; i < 10; i++) {
        printf("&arr[%d] = %p\n", i, &arr[i]);
        printf("arr + %d = %p\n", i, arr + i);
    }
    printf("\n");

    // 아래 3개의 for문은 모두 동일한 결과인 값을 반환한다.
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    for (int i = 0; i < 10; i++) {
        printf("%d ", *(arr + i));
    }
    printf("\n");

    for (int *ptr = arr; ptr < arr + 10; ptr++) {
        printf("%d ", *ptr); // 역참조 연산자 *를 통해 포인터가 가리키는 주소의 값을 알 수 있다
    }
    printf("\n");
}


실행결과 : 주소는 PC마다 다르므로 다르게 출력될 수 있다.


참고하면 도움이 되는 URL 링크

Java 개발자가 배우는 C++ 포인터와 참조형 데이터

https://github.com/HomoEfficio/dev-tips/blob/master/Java%20%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80%20%EB%B0%B0%EC%9A%B0%EB%8A%94%20C%2B%2B%20-%2002%20-%20%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%99%80%20%EC%B0%B8%EC%A1%B0%ED%98%95%20%EB%8D%B0%EC%9D%B4%ED%84%B0.md


블로그 이미지

Link2Me

,