반응형

이전에 변수형 포인터와 상수형 포인터를 설명했다.

배열도 포인터이다. int arr[ ]; 선언이라면, arr 그 이름 자체가 int* 자료형임을 설명했다.

https://ansan-survivor.tistory.com/1249

 

[C언어] C언어 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기

포인터에 대한 간단한 설명은 아래 참고. https://ansan-survivor.tistory.com/1237 [C언어] 포인터란? 포인터에 대해 쉽게 이해하기. (포인터 변수 사용하기, 포인터로 값 변경하기, (알아두기) 컴퓨터는 32비

ansan-survivor.tistory.com

 

만약 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을 선언할 수 있음.

 

 

 

 

반응형

+ Recent posts