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 구조체이름))
- 구조체 포인터에 구조체 변수의 주소를 할당
. 구조체포인터 = &구조체변수;
ㅇ 포인터의 배열에의 적용 ☞ 배열포인터 포인터배열 비교 참조