포인터의 포인터
- 포인터의 포인터(의 포인터 의 … ) – 더블 포인터
포인터의 포인터는 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다. 마찬가지로 포인터의 포인터의 포인터는 포인터 변수를 가리키는 또 다른 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다.
포인터 변수는 종류와 상관 없이 주소 값을 저장하는 변수인데, 다만 더블 포인터와 일반 싱글 포인터의 차이점은 가리키는 대상이 또 다른 포인터 변수인지, 일반 변수인지의 차이이다.
위의 예는 일반 변수, 싱글 포인터, 더블 포인터의 사용 예와 세 변수 간의 관계를 값으로 나타낸 예이다.
먼저, 7번 라인에서 일반 정수형 변수를 선언, 그 주소 값을 8번 라인에서 포인터 변수에 저장한다. 그리고 다시 그 포인터 변수의 주소 값을 9번 라인의 더블 포인터를 선언하고 저장한다. 다음은 11번 라인 ~ 13번 라인의 출력에 대한 결과를 나타내었다.
위의 실행 결과에서 첫 번째 결과 라인에서의 일반 정수형 변수의 주소 값을 출력 하였고, 이 주소 값을 두 번째결과 라인에서 싱글 포인터 변수에 값으로 대입되어 싱글 포인터 변수 pNum이 일반 변수 number를 가리키고 있는 형태를 이루었다. 그리고 마찬가지로 두 번째 결과 라인에서 싱글 포인터 변수의 주소 값을 출력 하였고, 이 주소 값을 세 번째 결과 라인에서 더블 포인터 변수에 값으로 대입되어 더블 포인터 변수 dpNum이 싱글 포인터 변수 pNum을 가리키는 형태를 이루고 있다.
두 번째 실행 결과 라인에서 * (애스터리스크) 연산자를 이용하여 pNum이 값으로 가지고 있는 주소에 접근하여 값을 출력한다.(가리키는 변수의 값을 출력) 세 번째 실행 결과 라인에서 **(더블 애스터리스크)를 이용하여 더블 포인터가 가지고 있는 싱글 포인터 주소에 접근하고 또 그 싱글 포인터가 가지고 있는 주소에 접근하여 값을 출력한다.(가리키고 가리키는 변수의 값을 출력)
사실, 참조의 더블 포인터(**)는 *(*더블 포인터 변수) 에서 소괄호가 생략된 형태이다.
- 포인터 배열의 포인터 형
8번 라인에서 정수형 포인터 타입 배열을 선언하여 n1과 n2의 주소 값을 배열의 각 요소에 대입하였다. 1차원 배열 이름의 포인터 형을 배열 이름이 가리키는 요소의 자료형을 고려하여 결정하듯이 1차원 포인터 배열 이름의 포인터 형 또한 배열 이름이 가리키는 요소의 자료형을 고려하면 된다. 11번 라인에서 배열 이름과 배열의 첫 번째 요소의 주소 값을 출력했는데 그 결과는 배열 이름 arr과 arr 배열의 첫 번째 요소의 주소가 일치했다. 이 때 배열 이름은 int * 형의 요소를 가리킨다. 즉 1차원 포인터 배열의 배열 이름은 더블 포인터 상수라고 할 수 있겠다. 그렇기 때문에 9번 라인에서 더블 포인터 변수에 배열 이름 arr을 아무런 처리 없이 대입하더라도 문제 없이 대입이 된다. 이어서 12번 라인에서 더블 포인터 변수를 이용하여 더블 포인터 연산을 통하여 포인터 배열의 각 요소에 접근하여 값을 출력하는 예제이다.
- 이중 포인터 이상의 다중 포인터 변수
다중 포인터 또한 더블 포인터와 완전히 같다.
- 포인터의 필요성
1. 자료구조를 위함.
2. 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시.
'컴퓨터 언어 정리 > C 언어' 카테고리의 다른 글
14 함수 포인터와 void 포인터 (0) | 2020.09.23 |
---|---|
13 다차원배열 및 포인터의 관계 (0) | 2020.09.21 |
11 다차원 배열 (0) | 2020.09.14 |
10 포인터와 함수 (0) | 2020.09.13 |
09 포인터와 배열 (0) | 2020.09.12 |