PTR   Pointer   포인터

(2020-04-22)

포인터, 포인터 연산자, 포인터 주소 연산자, Dereference, 역참조

1. [전산 일반]  포인터메모리의 특정위치를 가리키는 기호 또는 주소 값

  ㅇ (명칭) 위치를 참조하므로 참조자(Reference)라고도 함


2. [C 언어]  포인터 

  ㅇ 포인터 이란?
     - 컴퓨터 메모리정보를 간접적으로 참조하기 위한 수단

  ㅇ 포인터 자료형 
     - 기본 자료형이 아닌 독특한 융통성을 갖도록, 기본 자료형에서 파생시킨 파생 자료형 임

  ㅇ 포인터 변수 
     - 주소값을 갖는 변수
        . 또다른 변수를 가리키는 정수 형태의 주소값(포인터값)을 갖는 변수
        . 데이터 값이 아니라, 해당 내용을 가리키는 주소에 대한 숫자 값을 갖게되는 변수 
     - 결국, 메모리에서 데이터 위치에 대한 주소 값을 갖는 특별한 변수

  ㅇ 포인터 활용
     - 변수, 함수, 배열, 문자열, 구조체 등이 저장된 주소를 가리키는 데에 사용
     - 연결 리스트, , 스택, 트리 등 동적 자료구조를 다루는데에도 유용


3. [C 언어]  포인터 선언 및 초기화

  ㅇ 포인터 변수 선언 :  data_type *pt_name; (자료형 *포인터명;)
     - 한편, * 위치는 어디든 상관없음 : int *num; 또는 int * num; 또는 int* num;

  ㅇ `포인터 변수 선언` 및 `포인터 변수 초기화(대입)` 例 
     - 例)  int x, y ; // 일반 변수 선언 (정수형 일반 변수 x,y 선언)
     - 例)  int *p ;   // 포인터 변수 선언 (정수형 값을 가리키는 주소를 갖는 포인터 변수 p의 선언)
     - 例)  p = &x ;   // 주소 대입 (포인터 변수 초기화, 포인터 주소 연산자에 의한 주소 대입)
     - 例)  y = *p ;   // 값 대입 (포인터에 의해 지시되는 값을 변수 y에 대입)

  ㅇ 한편, 특정 자료형이 정해지지 않는 범용 포인터 선언 : void *pt_name;
     - (void 용도) 함수인수함수의 반환 자료형이 없을 때, 자료형을 숨기고 싶을 때 등 


4. [C 언어]  포인터 연산자

  ㅇ 포인터 주소 연산자 (&) (Reference Operator)
     - & 바로 뒤에 위치한 포인터 변수의 `주소값`을 알려줌
        . 문법 맞음 例) &var_name  // var_name : 일반 변수명 
        . 문법 오류 例) &array_name  // array_name : 배열명 
           .. 이 경우, &array_name[0] 가 맞음 (아래 5.항 참조)

  ㅇ 역참조 연산자 (*) (Dereference Operator)
     - 포인터 변수 앞에 *를 붙여 주소가 가리키는 `실제 데이터값`을 가져옴
     - 역참조 연산자 *에 의해, 값을 저장할 수도, 값을 가져올 수도 있음
        . 例) *ptr = 25;  // 포인터 변수 ptr이 가리키는 저장위치에 값 25를 저장(대입)함
        . 例)  y = *ptr ; // 포인터 변수 ptr(주소값 저장)에 포인터 연산자 *를 적용하여,
           .. 이를 통해 실제 저장된 데이터에 접근하여, 저장값을 가져와서 변수 y에 대입

  ㅇ 이중 포인터 (pointer to pointer) (** 또는 *** 등)
     - 포인터를 가리키는 포인터로써, 원래(첫번째) 포인터의 주소값을 갖게됨
        . 즉, `포인터 주소값`을 나타냄 
     - 이중 포인터의 선언 타입은 원래(첫번째) 포인터의 선언 타입을 따라감


5. [C 언어]  포인터 사용시 유의사항

  ㅇ 단지 포인터 선언 만으로는 메모리 내에 의미있는 주소를 갖지 않음
     - 따라서, 포인터 변수에 의미있는 값을 부여하는 방법 둘
        . 이미 선언되어있는 변수주소값을 대입함 : & 주소 연산자 사용
        . 동적 메모리 관리 함수 사용 : malloc(), calloc()
     - 한편, 의미있게 초기화되지 않은 포인터 변수를 의도치 않게 사용하지 않으려면,
        . 다음과 같이 NULL로 초기화하는 것이 바람직함 : int* pi = NULL;

  ㅇ 포인터의 배열에의 적용
     - 例) 배열 x를 포인터 p로 가리키는 방법 : p = x; 또는 p = &x[0];

  ㅇ 포인터의 구조체에의 적용 ☞ 구조체 참조


[배열,포인터] 1. C 배열 2. 포인터 3. 파일 포인터

 
        최근수정     요약목록     참고문헌