C 언어 개열/C 언어

포인터(Pointer) 변수

본클라쓰 2010. 8. 21. 11:12

 포인터와 포인터 변수는 같은 말로 포인터 변수는 메모리 주소를 저장하기 위한 변수이다. 포인터를 적절하게 사용하기 위해서는 기본적으로 두 개의 특별한 포인터 연산자들을 이해해야 한다.

  • & 연산자 : 자신의 피연산자의 메모리 주소를 리턴하는 단항 연산자로 주소 연산자라고 함.
  • * 연산자 : 선언시에는 포인터 변수를 선언하는 것이고 실행문에서는 그 포인터가 가리키는 변수의 값을 나타낸다.

 포인터 변수의 사용시에는 선언시의 자료형과 같은 자료의 형을 할당해야 한다. 변수의 주소는 특정 변수의 컴퓨터 메모리 내부에 위치하며, 주소는 프로그램 실행시 마다 다를 수 있다. 주소 값과 포인터는 다른 것이다.

#include <stdio.h>

int main(void) {

    int value = 1;
    int *pointer = &value;

    printf("1: %d \n", pointer);    // 주소값, 2293540
    printf("2: %d \n", *pointer);    // 가리키는 주소의 실제 값, 1
    printf("3: %d \n", &value);        // value변수의 주소값, 2293540
    printf("4: %d \n", &pointer);    // 포인터 변수 pointer의 주소값, 2293536

    return 0;
}

 

포인터를 이해하기 위해서는 다음의 예문을 살펴봐야 한다.

int value1 = 1;
int value2 = 2;

int *temp = &value1;    // 포인터변수 temp에 value1 주소값 대입
&value1 = &value2;        // value1 주소값에 value2 주소값 대임
&value2 = temp;            // value2 주소값에 temp 값 대임

printf("%d, %d \n", value1, value2);    // 값이 바뀌었나 확인


 위의 코드는 컴파일 오류를 발생한다. 이유는 간단하다. 변수의 주소값을 바꾸기 위한 코드 인데, 주소값을 변경하기 위해 &value1 = &value2 처럼 주소값을 변경하거나 할당하는 것은 불가능한 코드이다. 즉, Call-By-Reference 를 하기 위해 포인터를 사용하는 것이지, 주소값을 가지고 변경하기 위해서 사용하는 것이 아니다.

'C 언어 개열 > C 언어' 카테고리의 다른 글

Call by Value 와 Call by Address  (0) 2010.08.22
구조체(Structure)  (0) 2010.08.22
register 변수  (0) 2010.08.21
재귀함수(Recursive Function)  (0) 2010.08.21
printf 함수와 scanf 함수  (0) 2010.08.21