반응형
이전에 변수형 포인터와 상수형 포인터를 설명했다.
배열도 포인터이다. int arr[ ]; 선언이라면, arr 그 이름 자체가 int* 자료형임을 설명했다.
https://ansan-survivor.tistory.com/1249
만약 int * arr[20]; 이라는 선언이 있다.
위 arr 의 자료형은 int** 이다.
int* 와 arr은 상수형 포인터로 만약 int arr[20]; 선언을 했다면 int* 타입이 될 것이다.
고로 앞에 int* 과 상수형 포인터 *가 합쳐져서,
int * arr[20]; 의 자료형은 int* + int* = int** 가 된다.
예제)
도식관계를 그려보면 아래와 같다.
#include <stdio.h>
int main()
{
/*
아래 ptr1 ~ ptr3 까지의 선언은 선언과 동시에 ptr은 각 num의 주소를 가리킴.
*/
int num1 = 10, num2 = 20, num3 = 30;
int* ptr1 = &num1;
int* ptr2 = &num2;
int* ptr3 = &num3;
// 배열의 내부 인자로 사용할 값의 자료형이 int* 이므로, 배열이름의 자료형은 int* 형이 되어야 함
int* ptrArr[] = { ptr1, ptr2, ptr3 };
/*
ptrArr[0] -> ptr1 -> num1
ptrArr[1] -> ptr2 -> num2
ptrArr[2] -> ptr3 -> num3
이런식의 포인터가 선언된 것임.
*/
// ptrArr은 기본적으로 *int 자료형이고, 앞에 선언한 자료형이 int* 이므로, ptrArr 자체는 int** 자료형임.
int** dptr = ptrArr;
// 배열에 포인터를 선언하여 같은 첫번째 주소값을 공유함. 포인터를 배열 처럼 사용할 수 있다.
dptr[0] = 10;
dptr[1] = 20;
dptr[2] = 30;
printf("%d %d %d \n", dptr[0], dptr[1], dptr[2]);
return 0;
}
반응형
배열 내에 포인터값을 사용하기 위해서 선언을 하면, 배열 내부의 각 타입에 맞춰 배열이름의 타입형을 선언해야 함.
배열 내 사용할 인자들의 타입이 int* 이므로, 배열이름의 타입도 int* 이어야 함.
고로 -> int* arrPtr[20]; 이런식의 선언이 이루어짐.
배열 내 인자들은 더블포인터 상태임. arrPtr[0] 은 int* + int* 이므로 int** 자료형으로 위 예제처럼 dptr을 선언할 수 있음.
반응형
'C언어 \ C++ > 포인터 \ 배열' 카테고리의 다른 글
[C언어] Void 포인터 (함수 주소 저장, 값 주소 저장 만능상자) (0) | 2022.02.20 |
---|---|
[C언어] 함수포인터 (함수형 포인터) 이해하기 예제 (0) | 2022.02.20 |
[C언어] 포인터의포인터(더블포인터) Swap함수 예제 (0) | 2022.02.19 |
[C언어] 포인터의 포인터 (더블 포인터, 이중 포인터, 삼중 포인터) 이해하기 예제 (2) | 2022.02.19 |
[C언어] C언어 3차원 배열 선언 및 초기화 (0) | 2022.02.09 |