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);

즉, 변수의 주소를 알려주어 그곳에 입력값을 저장합니다.

포인터 개념

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

예를 들어 변수 a에 20이 저장되었을 때 메모리의 구조는 아래와 같습니다. 

int a = 20;

정확히 말하면 메모리 주소는 할당된 메모리 공간의 시작 주소입니다. 그리고 변수의 데이터 타입에 따라 메모리 공간의 크기가 결정됩니다. 이렇게 할당된 후 변수값인 20에 접근하기 위해서는 변수명을 사용하거나 메모리 주소 값인 80F를 사용하는 방법이 있습니다.

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

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

int* ptr = a;
printf("%d", *ptr);

#include<stdio.h>

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

OUTPUT
20

포인터 사용 시 좋은 점

  • 포인터는 배열 및 구조체를 보다 효율적으로 처리합니다.
  • 포인터는 함수에 대한 참조를 허용하므로 다른 함수에 함수 자체를 매개 변수로 전달할 때 도움이 됩니다.
  • 프로그램의 길이와 실행 시간을 단축합니다.
  • 포인터는 동적 메모리 관리를 지원하게 합니다.
<< 다음 혼자 공부하는 C언어 이전 >>
반응형

'프로그래밍 > C' 카테고리의 다른 글

C언어 이중 포인터  (0) 2019.12.20
포인터 변수 사용 방법  (0) 2019.12.20
C언어 공용체 (Union)  (0) 2019.12.20
typedef 별칭(Alias) 주기  (0) 2019.12.19
C언어 구조체 (Structure)  (0) 2019.12.19