2차원 배열 선언시 : 자료형 변수명 [row][column]
[]가 하나씩 붙을때마다 1차원씩 늘어나는 형태 ( ex)) 자료형 변수명[x][y][z]시 3차원 배열)
//자료형 변수명[raw][column]
int arr[2][3] = {
{ 11,12,13 },
{ 21,22,23 }
};
2차원 배열 (정적)선언시 column에 해당하는 변수는 입력을 해야 선언이 가능하다(raw에 해당하는 부분은 생략 가능)
해당 2차원 배열은 메모리 구조상 저렇게 있는 것이 아닌
이런 형태로 메모리를 할당 받는다.
다차원 배열은 그저 사람이 이해하기 쉽게 만들어 놓은 것일 뿐이다.
2차원 배열 초기화시 왜 row는 없어도 되는데 column은 있어야 할까?
int arr[][3] = {11,12,13,21,22};
해당 2차원 배열의 경우에는
초기화 해야 할 변수의 갯수는 몇개인지는 모르지만 3칸마다 줄을 바꾸면 된다 따라서
for (int row = 0; row < 2; ++row) {
for (int col = 0; col < 3; ++col)
{
printf("arr[%d][%d]: %d(%p)\n", row, col, arr[row][col], &arr[row][col]);
}
}
다음과 같은 값과 주소를 가지게 된다.
int형이기에 4byte씩 6개의 크기를 가진 배열이 되는 것이다.
printf("arr Size: %d byte\n", sizeof(arr));
printf("arr[0] Size: %d byte\n", sizeof(arr[0]));
printf("arr[0][0] Size: %d byte\n", sizeof(arr[0][0]));
그렇기에 배열 arr의 크기는 24byte이고 그중 첫번째 줄인 0번째 줄의 크기는 12byte이다
그리고 요소하나의 크기는 int형에서 알 수 있듯이 4byte이다.
우리가 기존에 사용하는 배열처럼 메모리에 할당을 받으니
printf("arr[0][4]: %d(%p)\n", arr[0][4], &arr[0][4]);
다음과 같이 0번째 줄에는 없더라도 5번째 요소를 호출하면
arr[1][1] 즉 5번째 요소에 위치한 값과 주소를 확인 할 수 있다.
그리고 각 줄을 호출하면
printf("arr: %p\n", &arr);
printf("arr[0]: %p\n", &arr[0]);
printf("arr[1]: %p\n", &arr[1]);
각 줄의 맨 앞 요소들이 호출됨을 알 수 있다.
배열 전체의 주소는 첫번째 요소와 같은 것도 확인이 가능하다.
그렇다면 반대로 일차원 배열을 이차원 배열처럼 호출 하는 것도 가능할까?
우선 이차원 배열이 만들어진 이유는 컴퓨터는 일차원 배열로 인식하고 동작하지만
우리 사람이 조금 더 배열을 쉽게 다루기 위해 이차원 배열이라는 형식이 만들어 진 것이다
그렇다면 이 이차원 배열을 호출하는 방법도
일차원 배열처럼 호출 하는 것이 가능은 하지만
이차원 배열을 호출하기 위한 방법이 따로 만들어졌다는 것이다.
이차원 배열을 호출하기 위해서는 이중 포인터를 사용하게 되어 있다
원리는 이렇다
다음과 같은 2차원 배열의 각 열의 주소(*)를 담는
주소(*)가 생기는 것이다
포인터를 통해 먼저는 해당 배열의 주소를 확인하고(**)
그리고 원하는 행의 주소를 확인한 뒤(*)
원하는 열의 요소를 탐색하는 것이다.
int arr1D[6] = { 11,12,13,21,22,23 };
int* pLine0 = &arr1D[0]; //11
int* pLine1 = &arr1D[3]; //21
int* arr2D[2] = { pLine0, pLine1 }; //sizeof : 16byte ->뒤의 값이 int형 포인터 2개를 담고 있는 배열이기에 16byte
int** pArr2D = arr2D; //sizeof : 8byte
printf("pArr2D[1][1] : %d\n", (pArr2D[1])[1]);
printf("*arr1D + 4: %d\n", *(arr1D + 4));
printf("* (*(pArr2D + 1) +1 ): %d\n", *(*(pArr2D + 1) + 1));
따라서 다음과 같이 1번 행의 1번 요소인 5번째요소를 탐색하기에 다음과 같은 방법들을 활용 할 수 있는데
이중 우리가 2차원 배열 1행 1열의 요소를 탐색하기 위해 이중 포인터를 활용하는 것이 접근성이 높은 방법중 하나임을 확인 할 수 있다.
*작성일 20240819, 추후 수정
.
'프로그래밍 언어 > C' 카테고리의 다른 글
공용체(Union) (0) | 2024.08.20 |
---|---|
구조체(Structure) (0) | 2024.08.20 |
정적/동적 메모리 할당(Memory Allocate) (0) | 2024.08.16 |
문자열 함수 활용 feat)예외처리 (0) | 2024.08.14 |
문자열(String) (0) | 2024.08.14 |