Skip to main content
Introducing Pointer in C

포인터

포인터 소개

포인터는 메모리에 직접 접근하여 값을 가지고 오거나 값을 변경할 수 있습니다.

포인터 변수는 같은 데이터 타입을 가진 다른 변수의 주소를 저장한 변수입니다. 즉 포인터는 주소 값을 저장한 변수입니다.

이러한 특별한 기능 때문에 언어적인 강력함과 유연성을 제공합니다. 하지만 처음 포인터를 접하는 입문자에게는 다소 복잡하고 어려운 개념일 수도 있습니다.

먼저 포인터가 저장하는 “변수의 메모리 주소” 개념부터 살펴보겠습니다.

변수 메모리 주소

변수 편에서도 언급했다시피 변수가 정의되면 메모리상에 해당 변수가 사용할 수 있는 공간이 할당됩니다. 해당 공간의 크기는 변수의 데이터 타입 크기입니다.

또한 변수의 메모리 주소를 얻기 위해서는 주소 연산자인 &를 사용합니다.

다음은 변수의 주소 값을 출력하는 간단한 예제입니다.

만약 result라는 변수를 정의했다면 주소 연산자(&result)를 붙여 주소 값을 얻을 수 있습니다.

#include<stdio.h>

void main()
{
    int var = 7;
    printf("변수에 저장된 값: %d\n", var);
    printf("변수의 메모리 주소: %x\n", &var);
}

OUTPUT
변수에 저장된 값: 7
변수의 메모리 주소: 5cf09c1c

어디선가 주소 연산자(&)를 자주 사용한 것 같지 않나요? 네 그렇습니다. scanf() 함수에서 사용자의 입력값을 변수에 저장하기 위해 &var와 같이 사용했습니다.

scanf("%d", &var);

위에서 보는 것과 같이 scanf() 함수는 값이 저장될 변수의 주소 값을 사용하여 값을 저장합니다.

포인터 개념

변수가 정의될 때 컴파일러는 내부적으로 메모리상에 공간을 할당합니다. 그리고 변수에 값이 초기화되거나 저장될 때 해당 이 메모리 공간에 값을 저장합니다.

이러한 메모리 공간은 주소 값을 가지고 있고 변수명으로 대표합니다.

예를 들어 변수 a의 메모리 시작 주소가 80F인 공간에 할당되고 10으로 초기화됐다고 가정하면 아래와 같습니다.

int a = 10;
Pointer when a variable is defined

정확히 말하면 메모리 주소는 할당된 메모리 공간의 시작 주소입니다. 그리고 변수의 데이터 타입에 따라 메모리 공간의 크기가 결정됩니다.

이렇게 할당된 후 변수값인 10에 접근하기 위해서는 변수명을 사용하거나 메모리 주소 값인 80F를 사용하는 방법이 있습니다.

그럼 어떻게 메모리 주소 값을 사용하여 값에 접근할 수 있을까요? 메모리 주소 역시 단순히 일련의 숫자이기 때문에 다른 변수에 저장될 수 있습니다. 이렇게 메모리 주소를 저장한 변수가 바로 포인터 변수입니다.

포인터 변수에는 다른 변수의 주소 값이 저장되어 있고 이것을 사용하여 다른 변수에 저장된 값에 접근할 수 있습니다.

int* ptr = a;
printf("%d", *ptr);
When a pointer variable is accessing to a value of a variable
#include<stdio.h>

void main()
{
    int a = 10;
    int* b = &a;
    printf("%d", *b);
}

OUTPUT
10

포인터 사용 시 이점

  1. 포인터는 배열 및 구조체를 보다 효율적으로 처리합니다.
  2. 포인터는 함수에 대한 참조를 허용하므로 다른 함수에 함수 자체를 매개 변수로 전달할 때 도움이 됩니다.
  3. 프로그램의 길이와 실행 시간을 단축합니다.
  4. 포인터는 동적 메모리 관리를 지원하게 합니다.

다음 시간에는 포인터의 선언 및 정의 그리고 사용 방법에 대해 더 구체적으로 살펴보겠습니다.

<< 다음 혼자 공부하는 C언어 이전 >>

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다