- 포인터가 가지는 주소 값은 처리하려는 데이터가 아니었다
- 포인터를 사용하는 목적이 가리키는 데이터를 사용하기 위한 것이었는데 이제부터는 주소 값 자체를 처리할 데이터로 생각해보자
- 즉, 주소를 저장한 포인터도 하나의 변수이고 따라서 그 주소를 구할 수 있으며 또 다른 포인터에 저장하고 가리키는 것도 가능하다 => 찾아간 주소 위치에 주소 값이 있다는 말이 된다
이중 포인터 개념
- 포인터도 메모리 저장 공간을 갖는 하나의 변수이다.
- 따라서 주소 연산으로 포인터의 주소도 구할 수 있다
- 예를 들어 어떤 변수를 가리키는 포인터 pi가 있고, 이 포인터 pi가 할당된 메모리의 시작 위치가 200번지일 때 그 주소를 구하면 다음과 같다
- 이 주소를 저장하는 포인터가 이중 포인터이다.
- 즉, 포인터의 주소는 이중 포인터에 저장하며 포인터를 가리킨다.
- 포인터의 주소를 저장한 이중 포인터에 간접 참조 연산을 수행하면 가리키는 대상인 포인터를 쓸 수 있다.
첫 번째 별 : ppi가 가리키는 자료형이 포인터
두 번째 별 : ppi 자신이 포인터임을 뜻함
이중 포인터를 선언하여 메모리에 저장 공간이 할당되면 그 이후에 이중 포인터를 사용할 때는 변수명을 사용한다
pi = &a; // int형 변수의 주소를 저장한 포인터
ppi = π // 포인터의 주소를 저장한 이중 포인터
규칙
- 포인터를 변수명으로 쓰면 그 안의 값이 된다
- 포인터에 &연산을 하면 포인터 변수의 주소가 된다
- 포인터의 *연산은 화살표를 따라간다
이중 포인터의 형태
포인터에서 형태를 얘기할 때는 2 가지를 명확히 구분해야 한다
=> 포인터가 가리키는 것의 형태와 포인터 자신의 형태이다
ex) int형 변수의 주소를 저장하는 포인터는 가리키는 자료형이 int형이고 자신의 형태는 (int *)이 된다.
이중 포인터를 선언할 때는 이중 포인터에 저장할 주소가 어떤 포인터형의 주소인지를 먼저 파악한다
double a = 3.5;
dobule *pi = &a;
pi가 (double *)형 변수이므로 &pi는 (double *)형의 주소가 된다.
따라서 (double *)형을 가리키는 이중 포인터를 선언한다
=> ppi = π를 수행한 그림
주소와 포인터의 차이
포인터는 변수이므로 주소 연산자를 사용하여 그 주소를 구할 수 있지만 상수인 주소에는 주소 연산자를 쓸 수 없다
int a;
int *pi = &a; // 주소를 포인터에 저장
π // 포인터에 주소 연산자 사용 가능 (0)
&(&a); // a의 주소에 다시 주소 연산자 사용 불가능 (X)
다중 포인터
- 이중 포인터도 변수이므로 주소 연산자를 사용하면 그 주소를 구할 수 있다.
- 이중 포인터의 주소는 3중 포인터에 저장한다
double ***ppp;
- 같은 방식으로 4중 이상의 포인터도 사용할 수 있으나 프로그램의 가독서을 떨어뜨리므로 가능하면 사용하지 않는다.
- 이중 이상의 포인터를 다중 포인터라 부른다
이중 포인터 활용 1 : 포인터 값을 바꾸는 함수의 매개변수
이중 포인터 활용 2 : 포인터 배열을 매개변수로 받는 함수
배열 요소의 주소와 배열의 주소
2차원 배열과 배열 포인터
2차원 배열의 요소를 참조하는 원리
'C 언어 > [책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글
배열을 처리하는 함수 (2) (0) | 2023.01.26 |
---|---|
배열을 처리하는 함수 (1) (0) | 2023.01.26 |
배열과 포인터의 관계 (2) (0) | 2023.01.26 |
배열과 포인터의 관계 (1) (0) | 2023.01.26 |
전처리 지사자 (2) (0) | 2023.01.11 |