PTR   Pointer   포인터

(2024-07-10)

Pointer , 포인터 , 포인터 연산자, 포인터 주소 연산자, 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에 대입)


4. [C 언어]  범용 포인터, 제너릭 포인터 (generic pointer)

  ㅇ 범용 포인터 선언  :  void *ptr;  
     - 특정 자료형이 정해지지 않는 범용의 포인터를 선언 

  ㅇ (유의점) 역참조, 산술연산 불가
     - 즉, *ptr (x), ptr++ (x)

  ㅇ (void 용도) 
     - 함수인수함수의 반환 자료형을 특정 않고 다양한 형태로 사용할 때, 
        . (여러 다양한 자료형을 입력 인수로 받아들일 수 있게 만들 때)
     - 자료형을 숨기고 싶을 때, 
     - 자료형이 다른 포인터와 자료형 변환 없이도 암시적으로 형변환 저장시키는 등


5. [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) (** 또는 *** 등)
     - 포인터를 가리키는 포인터로써, 원래(첫번째) 포인터의 주소값을 갖게됨
        . 즉, `포인터 주소값`을 나타냄 
     - 이중 포인터의 선언 타입은, 원래(첫번째) 포인터의 선언 타입을 따라감


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

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


7. [C 언어]  배열 포인터 (Pointer to Array)
     - 의미  :  배열을 가리키는 포인터. 즉, 배열의 시작주소값을 저장하는 포인터
     - 배열 포인터선언  :  (괄호 있음) 
        . (형식) 자료형 (*포인터이름)[배열크기]
     - 배열 포인터선언 및 초기화 例)
        . char arr[2][3] = {"abc","def"}; char (*arrPtr)[3] = arr; 
     - 배열을 포인터로 가리킬 때 (포인터에 대입할 때)
        . arrPtr = arr;  또는  arrPtr = &arr[0];
        . (사실상, 배열이란, 배열 자신의 첫 번째 원소를 가리키는 포인터 임)

  ㅇ 포인터 배열 (Array of Pointer)
     - 의미  :  포인터를 여럿 담은 배열. 즉, 주소값들을 저장하는 배열
     - 포인터 배열선언  :  (괄호 없음)
        . (형식) 자료형 *포인터이름[배열크기]
     - 포인터 배열선언 및 초기화 例)
        . char *charPtr[] = {"Alan","Frank","Mary","John","Lisa"};
        . int num1,num2; int *numPtr[] = {&num1,&num2};
     - 포인터 배열의 용도
        . 배열 포인터함수 선언을 해서 2차원 배열의 데이터파라미터로 받을때 많이 사용

  ※ 배열 요소에의 접근  :  (`포인터 배열` 및 `배열 포인터` 둘 다, 인덱스에 의한 접근이 가능) 
     - arr[i]  또는  *(arr + i)  또는  ptr[i]  또는  *(ptr + i)


8. [C 언어]  (참고사항)

  ㅇ 포인터의 구조체에의 적용 ☞ 구조체 참조
     - 구조체 포인터동적 메모리 할당 :
        . struct 구조체이름 *구조체포인터이름 = malloc(sizeof(struct 구조체이름))
     - 구조체 포인터에 구조체 변수의 주소를 할당
        . 구조체포인터 = &구조체변수;

  ㅇ 포인터의 배열에의 적용  ☞ 배열포인터 포인터배열 비교 참조

[배열,포인터 ⇩]1. C 배열   2. 포인터   3. 함수 포인터   4. 파일 포인터   5. 배열 포인터  

  1. Top (분류 펼침)      :     1,591개 분류    6,514건 해설

"본 웹사이트 내 모든 저작물은 원출처를 밝히는 한 자유롭게 사용(상업화포함) 가능합니다"
     [정보통신기술용어해설]       편집·운영 (차재복)          편집 후원          편집 이력