본문 바로가기

C

18강 . 다차원 배열 그리고 포인터

[2차원 배열 이름의 포인터 타입]

[1차원 배열이름의 포인터 타입 결정 포인트]

  • 포인터가 가리키는 요소의 자료형
  • 포인터 연산시 증가하는 바이트의 크기

그래서 원래는 int * (가리키는 요소의 자료형 ) arr [4] (포인터 연산시 증가하는 바이트 크기)

이지만 배열 이름이 가리키는 요소의 자료형이 일치한다면 ,

포인터 연산시 증가하는 값의 크기도 일치하기에 생략하여 int * arr이다.

 

[다배열이름의 포인터 타입 결정 포인트]

  • 포인터가 가리키는 요소의 자료형
  • 포인터 연산시 증가하는 바이트의 크기

포인터가 가리키는 요소의 자료형이 같다해도 포인터 연산시 증가하는 값의 크기가 불일치한다.

int a[3][2]={1,2,3,4,5,6};

printf("a[0]:%d\n",a[0]);	// 1 
printf("a[0]:%d\n",a[1]);	// 3
printf("a[0]:%d\n",a[2]);	// 5

printf("a[0]:%d\n",a+1);	// 3
printf("a[0]:%d\n",a+1);	// 5
//포인터 연산시 행단위로 이동

//행단위 요소 참조이기에 a[0]의 사이즈는8 (a[0],a[1]의 크기인 4+4)
a는 24 / a+0=4 , a+1 = 4

2차원 배열 이상의 포인터 타입의 구성은

(가리키는 대상의 자료형 + 포인터 연산시 증가하는 바이트의 크기)로 구성된다.

int arr[2][4];

의 이름인 arr은 int :이름 (*pArr) : 강조 [포인터이다!] [4] : 포인터 연산시 증가 크기

[매개변수로 선언되는 포인터의 또 다른 표현]

void ShowData(int (*arr)[4])
void ShowData (int arr[][4]);
//같다 ! 단 , 매개변수로 선언시 사용

int main(void)
{
	int arr1[2][4]={1,2,3,4,5,6,7,8};
    
    int (*pArr)[4]=arr1;
    int ptr2[][4]=arr1;	//Error (배열의 크기가 정해져 있지 않기에
    )
}

[주의!]

int *pArr1[4]	//1차원 포인터 배열
int (*pArr2)[4]	//다차원 배열 포인터

[다양한 형태의 배열 요소 접근 방법]

int a[3][2]={{1,2},{3,4},{5,6}};

a[0] == *(a+0)

a[1][2]==(*(a+1))[2];
a[1][2]==*(a[1]+2);
a[1][2]==*(*(a+1)+2);

'C' 카테고리의 다른 글

22장 . 구조체와 사용자 정의 자료형 1  (0) 2023.01.10
19강.함수 포인터와 void포인터  (0) 2023.01.08
16장 . 다차원 배열  (0) 2023.01.08
14강 . 포인터와 함수에 대한 이해  (0) 2023.01.05
13강 . 포인터와 배열  (0) 2023.01.05