[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 |