ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5. 포인터
    Programming Language/C 2020. 1. 31. 17:10

    포인터(poitner)는 C언어의 가장 대표적인 특징 중 하나로, 일반 변수의 메모리 주소를 값으로 가지는 변수이다. 포인터를 사용하면 변수명을 통하지 않고도 사용하고자 하는 대상에 직접 접근할 수 있어 프로그램이 간결하고 효율적으로 제어된다. 포인터 변수는 (자료형) * (변수명); 과 같이 선언된다. *은 (변수명)이 포인터 변수임을 표시하고, (자료형)은 포인터 변수인 (변수명)에 저장될 주소에 저장될 데이터의 유형을 지정한다. 예를 들어 int * ptr; 이라는 문장은 정수형(int)의 자료를 담을 주소를 저장할 포인터 변수 ptr을 선언하는 문장이다.

     

    #include <stdio.h>
    
    int main(void)
    {
        int a = 10;
        int *p = &a;
      
        printf("a의 주소 : %p \n", p);
        printf("p의 주소 : %p \n", &p);
        printf("p가 가리키는 a에 저장된 값 : %d \n", *p);
    
        return 0;
    }

     

    포인터 자료형으로 사용되는 연산자에는 주소 연산자와 간접 연산자가 있다. 주소 연산자 &는 일반 변수명에 사용하며, 해당 변수의 메모리 주소를 추출하는 연산자이다. 1주차와 2주차에 걸쳐서 살펴본 scanf(“%d”, &num); 에서 &가 이 주소 연산자이다. 즉, scanf() 함수는 앞에서 선언해놓은 변수의 주소에 입력받은 값을 저장하는 것이다. 간접 연산자 *는 포인터 변수명에 사용하며, 주소가 저장되어있는 메모리 위치를 가리킨다. 정리하자면 만약 int * p = &a; 라고 선언되었을 때, p는 a의 주소값, &p는 포인터 변수 p의 주소값, *p는 a에 저장되있는 값을 의미한다.

     

    #include <stdio.h>
    
    int main(void)
    {
        int i, a[10] = {1, 5, 3, 6, 4, 7, 2, 9, 8, 0};
    	
        for(i=0; i<10; i++){
            printf("a[i] : %d\n", a[i]);
            printf("*(a+i) : %d \n\n", *(a+i));
        }
    	
        return 0;
    }

    포인터와 배열은 매우 긴밀히 연관되어있다. 앞에서 예시로 든 int a[10]; 라는 선언을 다시 보자. 배열의 이름은 배열의 시작 주소를 저장하는 포인터 상수이다. 즉 *a와 a[0]은 동일한 의미이고, *(a+i) 는 a[i]와 동일하다. 배열명은 그 자체로서 포인터이지만, 그 값이 변할 수 없다는 점에서 포인터 변수와 다르다. 포인터 변수 p에 대해 p++은 원래 p가 가리키던 곳의 다음 주소, *p++은 그 주소에 들어있는 값을 의미하는 반면, 배열명 a는 a++와 같이 증감 연산자를 사용할 수 없다.

    'Programming Language > C' 카테고리의 다른 글

    4. 배열과 문자열  (0) 2020.01.31
    3. if-else, for, while  (0) 2020.01.31
    2. 버퍼와 getchar()  (0) 2020.01.31
    1. 자료형과 표준 입출력 함수  (0) 2020.01.31
    0. Hello C!  (0) 2020.01.31

    댓글

Designed by Tistory.