카테고리 없음

[따배시] 포인터에 대한 개념 설명

기술1 2024. 1. 16. 11:44

int a;

int b;

int c;

를 하면 주소를 저장하고 데이터를 저장한다.

 

int type은 4byte 즉 4개의 공간을 사용하며 double은 8개의 공간을 사용하는 방식이다.

 

변수가 주소를 사용하니 주소를 알고 싶다면?


&a; 를 사용하면 주소연산자가 적용이 되어서 주소로 사용되는 숫자의 값을 가져온다. 이를 해서 다른 변수에 대입해줄 수 있으며 주소값을 저장하는 변수는 *a_ptr 즉 *를 앞에 붙여준다.

int *a_ptr = &a;

a_ptr도 변수이므로 메모리에 공간을 가지고 있다. 이 메모리 값에 주소 값을 저장하는 것이다. 

 

포인터는 주소를 저장하는 것이기 때문에 직접 데이터를 저장하는 것보다는 다른 메모리의 공간을 가리키는 역할을 한다. 그래서 이름이 pointer 즉 가리키다라는 뜻인 것이다. 

포인터 개념


간접적으로 메모리를 접근한다

 

int a = 7;

int (*a_ptr) = &a;

 

실제로 그 주소의 데이터를 가져오려면 어떻게 해야 할까?

int a = 7;

int (*a_ptr) = &a;

*a_ptr = 8;

이 주소를 보고 메모리를 찾아가서 공간에 대해서 찾아간다. &a의 주소이기 때문에 int a와 똑같이 작동하는 것이다.

 

a의 주소값을 보고 *을 보고서 간접 접근 operator로 해석을 해서 메모리를 찾아간다. 그리고 int가 있었기 떄문에 4byte 공간으로부터 데이터를 가져온다. 이 데이터의 경우 7이라는 데이터를 저장한 것이다. 

 

 

#include <stdio.h>
#include "Myheader.h"

int main() {
    // 변수 선언
    int a, b;

    // 변수 'a' 초기화
    a = 123;

    // 포인터 선언 및 초기화
    int *a_ptr;  // 정수를 가리킬 포인터 선언
    a_ptr = &a;  // 'a'의 주소를 포인터에 할당

    // 값과 주소 출력
    printf("%d %d %p\n", a, *a_ptr, a_ptr);

    // 포인터를 통한 값 수정
    *a_ptr = 456;

    // 업데이트된 값과 주소 출력
    printf("%d %d %p\n", a, *a_ptr, a_ptr);

    // 'a_ptr'이 가리키는 값 'b'에 할당
    b = *a_ptr;

    // 'b'의 값 출력
    printf("%d\n", b);

    // 'a' 다시 수정
    *a_ptr = 789;
    printf("%d\n", b);  // 주의: 'b'는 자동으로 업데이트되지 않음

    // 최종 값과 주소 출력
    printf("%d %d %p\n", a, *a_ptr, a_ptr);

    // 'b'를 업데이트해도 'a'나 '*a_ptr'에는 영향을 미치지 않음
    b = 12;
    printf("%d\n", b);
    printf("%d %d %p\n", a, *a_ptr, a_ptr);

    // 'a' 업데이트
    a = 1004;
    printf("%d %d %p %d\n", a, *a_ptr, a_ptr, b);

    return 0;
}

이 프로그램에서 포인터의 기본 개념을 확인할 수 있습니다. 'a'의 주소를 포인터에 할당하고 포인터를 통해 값을 수정하며, 포인터를 사용하여 변수 'b'에 값을 할당합니다. 주의해야 할 점은 포인터를 통해 값이 수정되면 해당 값이 가리키는 변수도 함께 변경된다는 것입니다.

 

포인터를 측정하기 위해선 NULL값을 사용하기도 합니다.

NULL이면 ~하고 NULL이 아니면 ~해라 같이 IF문을 이용할 때 쓰이기 떄문입니다.

#include <stdio.h>

int main() {
    int* safer_ptr = NULL;  // 기본적으로 포인터를 NULL로 초기화

    int a = 123;

    safer_ptr = &a;  // 안전한 포인터에 변수 'a'의 주소 할당

    // 조건에 따라 포인터 재할당
    if (a % 2 == 0)
        safer_ptr = &a;

    // 안전성 확인 후 출력
    if (safer_ptr != NULL)
        printf("%p\n", safer_ptr);

    return 0;
}

 

코드 설명
포인터 초기화: int* safer_ptr = NULL;에서 포인터 safer_ptr을 기본적으로 NULL로 초기화합니다. 이는 안전한 프로그래밍 관행 중 하나로, 포인터를 사용하기 전에 명시적으로 초기화하는 것이 좋습니다.

변수 주소 할당: safer_ptr = &a;를 통해 포인터에 변수 'a'의 주소를 할당합니다.

조건에 따른 포인터 재할당: if (a % 2 == 0) 조건을 확인하여, 변수 'a'의 값이 짝수이면 다시 safer_ptr에 'a'의 주소를 할당합니다. 이는 예제를 위한 임의의 조건으로, 실제 상황에서는 필요한 조건을 적용하면 됩니다.

안전성 확인 후 출력: if (safer_ptr != NULL)를 통해 포인터가 NULL이 아닌지 확인한 후, 안전하게 포인터의 값을 출력합니다.

코드 실행 결과
실행 결과는 safer_ptr이 안전하게 할당되어 있다면 해당 포인터의 주소를 출력하게 됩니다. 이렇게 함으로써 포인터의 안전한 사용을 보장하고, NULL인 경우에는 출력을 하지 않도록 하는 등의 안전성을 고려한 프로그래밍이 가능합니다.