-
20140331 (2차원 배열, 이중포인터, 배열포인터)부산IT학원/스마트컨트롤러 2014. 3. 31. 10:54
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;
}위의 예제처럼 이 차원 배열로도 사용할 수 있다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140402 (main 인자전달, stream) (0) 2014.04.02 20140401 (함수 포인터, void 포인터) (0) 2014.04.01 20140328 (const, 2차원배열) (0) 2014.03.28 20140327 (포인터, 배열, call by address, call by value) (0) 2014.03.27 20140326 (배열) (0) 2014.03.26