20140331 (2차원 배열, 이중포인터, 배열포인터)
31일차
-------------------------
2차원 배열 메모리 구조
-------------------------
-
char Arr[3][3];
int * ip = &Arr[0][0];
2차원 배열이 실제 메모리에서는
이런 식으로 저장되어 있다.
그래서 아래와 같이 모두 같은 값을 가리킨다.
ip[3] == Arr[0][3] == Arr[1][0]
- 줄 이동 (주소값)
Arr + 0 = &Arr[0] + 0 = &Arr[0]
Arr + 1 = &Arr[0] + 1 = &Arr[1]
Arr + 2 = &Arr[0] + 2 = &Arr[2]
- 칸 이동 (주소값)
&Arr[0][0] = Arr[0] + 0 = *(Arr + 0) + 0 = *( &Arr[0] + 0 ) + 0
&Arr[0][1] = Arr[0] + 1 = *(Arr + 0) + 1 = *( &Arr[0] + 0 ) + 1
&Arr[0][2] = Arr[0] + 2 = *(Arr + 0) + 2 = *( &Arr[0] + 0 ) + 2
- 칸 이동 (값)
Arr[0][0] = *(Arr[0] + 0) = *( *(Arr + 0) + 0 ) = *( *( &Arr[0] + 0 ) + 0 )
Arr[0][1] = *(Arr[0] + 1) = *( *(Arr + 0) + 1 ) = *( *( &Arr[0] + 0 ) + 1 )
Arr[0][2] = *(Arr[0] + 2) = *( *(Arr + 0) + 2 ) = *( *( &Arr[0] + 0 ) + 2 )
-----------------------
---배열에서 []숫자 생략
배열에서 []안에 숫자 생략이 가능한데 맨 왼쪽에 있는 숫자 하나만 가능하다.
다만 초기화시에만 가능.
int iaArr[ ] = {1, 2, 4, 5};
int iaArr[ ][2] = { {1, 2}, {3, 4} };
int iaArr[ ][2][2] = { { {1, 2}, {3, 4} }, { {1, 2}, {3, 4} } };
------------------
---포인터의 포인터
int iNum = 3; iNum -> 3
&iNum -> iNum주소
int * ip = &iNum; ip -> iNum주소
&ip -> ip주소
*ip -> 3
int ** ipp = &ip; ipp -> ip주소
&ipp -> ipp주소
*ipp -> iNum주소
**ipp -> 3
--------------------------
---배열 포인터, 포인터 배열
int arr[3][4]; // 배열
int * ptr2[4]; // 포인터 배열 , 이 변수 크기 16byte
int (*ptr)[4]; // 배열 포인터 (16byte씩 건너뛰는 포인터) , 이 변수 크기 4byte
int (* ptr)[4]; // 포인터방식 선언
int ptr[][4]; // 배열방식 선언
둘 다 4byte 크기의 포인터로 연산시 16byte씩 이동하는 같은 뜻이다.
ex) 예제 소스
#include <stdio.h>
void ShowArr2DStyle(int (*arr)[4], int column)
{
int i;
int j;
for(i = 0; column > i; ++i)
{
for(j = 0; 4 > j; ++j)
{
printf("%d ", arr[i][j] );
}
printf("\n");
}
printf("\n");
printf("arr : %d \n", sizeof(arr) );
}
int Sum2DArr(int arr[][4], int column)
{
int i;
int j;
int sum = 0;
for(i = 0; column > i; ++i)
{
for(j = 0; 4 > j; ++j)
{
sum = sum + arr[i][j];
}
}
printf("arr : %d \n", sizeof(arr) );
return sum;
}
int main()
{
int arr1[2][4] = {1,2,3,4,5,6,7,8};
int arr2[3][4] = {1,1,1,1,3,3,3,3,5,5,5,5};
ShowArr2DStyle(arr1, sizeof(arr1)/sizeof(arr1[0]) );
ShowArr2DStyle(arr2, sizeof(arr2)/sizeof(arr2[0]) );
printf("arr1의 합 : %d \n", Sum2DArr(arr1, sizeof(arr1)/sizeof(arr1[0]) ) );
printf("arr2의 합 : %d \n", Sum2DArr(arr2, sizeof(arr2)/sizeof(arr2[0]) ) );
return 0;
}
위의 예제처럼 이 차원 배열로도 사용할 수 있다.