TITEDIOS 편한 코딩

C 기초강의: #14 포인터 - 포인터 기초 개념 및 사용 방법 본문

C++

C 기초강의: #14 포인터 - 포인터 기초 개념 및 사용 방법

TitediosKW 2024. 9. 1. 19:00
반응형

포인터입니다. C언어를 어렵게 하는 주범이고 많은 분들이 이 포인터에서 좌절하곤 합니다. 하지만 C언어에서 제공하는 가장 강력한 무기이기도 한 이 포인터에 대해 꼭 공부해야 합니다. 다만, 제가 늘 강조하듯이 너무 어렵게만 접근하거나 한 번에 이해하려고 하기 보다는 이런 개념이 있고 이 개념에 대해서 천천히 학습해가시면 어느 순간 손가락에 익숙해지는 시간이 오기 마련입니다. 너무 걱정마시고 저와 함께 포인터에 대해 알아보겠습니다. 이 포스팅에서는 포인터의 기초 개념을 시작으로, 포인터의 다양한 활용법과 주의사항까지 다루어 보겠습니다. 포인터를 제대로 이해하면 C언어를 더 깊이 있게 사용할 수 있습니다.


1. 포인터란 무엇인가?

포인터(pointer)는 메모리 주소를 저장하는 변수입니다. 일반적인 변수는 특정 데이터 타입(int, char, float 등)의 값을 저장하지만, 포인터는 이러한 데이터가 저장된 메모리의 주소를 저장합니다. 즉, 어떤 데이터가 저장되어 있는 메모리의 정확한 위치를 가리키는 역할을 합니다.

 

왜 포인터를 사용할까요?

  • 메모리 효율성: 큰 데이터를 복사하는 대신 주소만 전달하여 메모리 사용량을 줄일 수 있습니다.
  • 동적 메모리 할당: 프로그램 실행 중에 필요한 만큼의 메모리를 동적으로 할당하고 해제할 수 있습니다.
  • 데이터 구조: 배열, 연결 리스트, 트리 등 다양한 자료구조를 구현하는 데 필수적입니다.
  • 함수 인자 전달: 큰 데이터를 함수에 전달할 때 복사하는 오버헤드를 줄일 수 있습니다.
반응형

2. 포인터의 선언과 사용

  • 포인터 선언:
int *ptr; // int형 데이터를 가리킬 수 있는 포인터 변수 선언
  • 주소 연산자(&): 변수의 주소를 반환합니다.
int num = 10;
int *ptr = # // ptr은 num 변수의 주소를 저장
  • 간접 참조 연산자(*): 포인터가 가리키는 값에 접근합니다.
int value = *ptr; // value에는 num 변수의 값이 저장됨
  • 예제
#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a;  // 포인터 p는 a의 주소를 가리킴

    printf("Value of a: %d\n", a);       // 10 출력
    printf("Address of a: %p\n", p);     // a의 메모리 주소 출력
    printf("Value pointed by p: %d\n", *p); // 10 출력 (포인터 p가 가리키는 값)

    *p = 20;  // 포인터 p가 가리키는 값을 20으로 변경
    printf("New value of a: %d\n", a);   // 20 출력

    return 0;
}

위 코드에서 a는 정수 값을 저장하는 변수이고, p는 a의 메모리 주소를 가리키는 포인터입니다. &a는 변수 a의 주소를 반환하며, *a는 a의 값에 접근합니다.


포인터의 활용

  • 배열과 포인터: 배열 이름은 배열의 첫 번째 원소의 주소를 가리키므로, 포인터를 이용하여 배열을 다룰 수 있습니다.
  • 함수와 포인터: 함수의 인자로 포인터를 전달하여 함수 내에서 원본 데이터를 수정할 수 있습니다.
  • 동적 메모리 할당: malloc 함수를 이용하여 동적으로 메모리를 할당하고, free 함수를 이용하여 해제합니다.
  • 포인터 연산: 포인터 값에 정수를 더하거나 빼서 다음 또는 이전 요소를 가리킬 수 있습니다.

포인터 사용 시 주의사항

포인터를 사용하면서 주의해야 할 몇 가지 중요한 사항이 있습니다:

초기화되지 않은 포인터 사용

초기화되지 않은 포인터는 예측할 수 없는 메모리 주소를 가리킬 수 있으며, 이는 프로그램 충돌이나 데이터 손상을 초래할 수 있습니다.

int *p; // 초기화되지 않은 포인터
printf("%d", *p); // 위험한 접근

NULL 포인터 사용

포인터를 초기화할 때, 사용할 메모리를 아직 할당받지 않았을 경우 NULL로 초기화하는 것이 좋습니다. 이는 잘못된 메모리 접근을 방지할 수 있습니다.

int *p = NULL;

동적 메모리 해제

아직 공부하진 않았지만, 포인트를 이용하는 동적 메모리를 사용한 후에는 반드시 free 함수를 통해 메모리를 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다.

free(p); // 동적 메모리 해제

결론

포인터는 C언어에서 매우 중요한 개념으로, 이를 제대로 이해하고 사용할 줄 아는 것은 고급 C 프로그래머로 가는 길입니다. 포인터를 사용하면 메모리 관리, 데이터 구조 구현, 함수 간 데이터 전달 등을 효율적으로 처리할 수 있습니다. 하지만 포인터를 잘못 사용하면 오류나 버그가 발생하기 쉽기 때문에, 주의 깊게 다뤄야 합니다.

 

이 포스팅이 포인터의 기초 개념을 이해하는 데 도움이 되었기를 바랍니다. 포인터를 충분히 연습하고 다양한 예제를 다뤄보면, C언어의 강력함을 더 깊이 이해할 수 있을 것입니다.

 

도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.

 

감사합니다!

반응형