[따배시] 포인터에 대한 개념 설명
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인 경우에는 출력을 하지 않도록 하는 등의 안전성을 고려한 프로그래밍이 가능합니다.