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];
ㅇ 포인터의 구조체에의 적용 ☞ 구조체 참조