[개념] Chapter 12 포인터의 이해

Date:     Updated:

카테고리:

태그:

12-1 포인터란 무엇인가?

포인터는 C언어가 Low 레벨 언어의 특성을 지닌다고 이야기하게 만든 장본인이다. 왜냐하면 포인터를 이용하면 메모리에 직접 접근이 가능하기 때문이다.

예를 들어 int형 변수 num이 0x12ff76번지에 할당되어 있다고 하자
그런데 주소 값 0x12ff76 역시도 정수이다. 그래서 이것도 저장이 가능하며, 이것을 저장하기 위해 마련된 변수가 바로 포인터 변수이다.

그러므로 포인터 변수란 메모리의 주소 값을 저장하기 위한 변수이다.

포인터 변수 장점

포인터 변수는 저장된 주소값을 통해 언제든지 해당 변수에 접근을 할 수 있다.
그런데 그게 어떤 장점이 인건지 이해가 잘 되지 않는다.
일반 변수는 메모리를 컴퓨터가 관리하지만 포인터로 관리하는 변수는 개발자가 직접 메모리를 관리할 수 있다.

포인터 사용을 통해 얻을 수 있는 장점은 다음과 같다.

  1. 메모리에 직접 접근이 가능
  2. 구조화된 자료를 만들어 효율적 운영이 가능
  3. Call by reference 방식 이용 가능
  4. 배열, 구조체 등의 복잡한 자료 구조와 함수에 쉽게 접근
  5. 메모리 동적 할당이 가능

지금까지 포인터 변수가 무엇이고 어떤 장점이 있는지 알아봤으니 사용에 대해 알아본다.

포인터 변수 선언

int main(void)
{
    int num = 7;
    int* pnum; // 포인터 변수 pnum 선언
    pnum = # // num의 주소 값을 포인터 변수 pnum에 저장
}

다음과 같이 포인터 변수를 선언하고 사용할 수 있다. &연산자는 피연산자의 주소 값을 반환하는 연산자이다.

포인터 변수 크기

포인터 변수의 크기는 4바이트가 될 수도 있고 8바이트가 될 수도 있다.
32비트 시스템에서는 주소 값을 32비트로 표현하기 때문에 포인터 변수의 크기가 4바이트이다.
64비트 시스템에서는 주소 값을 64비트로 표현하기 때문에 포인터 변수의 크기가 8바이트이다.

포인터 변수 선언

int* pnum1;
double* pnum2;
unsigned int* pnum3;

이처럼 type* ptr 이라는 공식을 통해 포인터 변수를 선언할 수 있다.

12-2 포인터와 관련 있는 연산자 : & 연산자와 * 연산자

변수의 주소 값을 반환하는 & 연산자

& 연산자는 피연산자의 주소 값을 반환하는 연산자이다.

int main(void)
{
    int num = 5;
    int* pnum = # // num의 주소 값을 반환해서 포인터 변수 pnum을 초기화
}

포인터가 가르키는 메모리를 참조하는 * 연산자

* 연산자는 포인터가 가리키는 메모리 공간에 접근할 때 사용하는 연산자이다.

int main(void)
{
    int num = 10;
    int* pnum = # // 포인터 변수 pnum이 변수 num을 가리키게 하는 문장
    *pnum = 20; // pnum이 가리키는 변수에 20을 저장
    printf("%d", *pnum); // pnum이 가리키는 변수를 부호 있는 정수로 출력
}

사실상 *pnum은 pnum이 가리키는 변수 num을 의미하는것이다.

포인터의 형은 메모리 공간을 참조하는 기준이 된다. 즉 포인터 형을 정의한 이유는 * 연산자를 통한 메모리 공간의 접근 기준을 마련하기 위함이다.

널 포인터

포인터 변수를 선언만 해 놓고, 이후에 유효한 주소 값을 채워 넣을 생각이라면 다음과 같이 초기화 하는 것이 좋다

int main(void)
{
    int* ptr1 = 0;
    int* ptr2 = NULL; // NULL은 사실상 0을 의미
}

ptr1을 초기화하는 값 0을 널 포인터라고 한다.

맨 위로 이동하기

C 카테고리 내 다른 글 보러가기

첫 번째 글입니다 가장 최근 글입니다

댓글남기기