/*****



함수에 배열을 전달하거나 포인터 관리하기



*****/



# include <stdio.h>




//함수 선언 부분


//void Func(int _arr[5][5]);



//void PrintArray1D(int _arr[5]);


//void PrintArray2D(int _arr[5][5]);



void PrintArray1D(int _arr[] , int _len);


void PrintArray2D(int _arr[][5], int _len);



void Func(int _arr[5][5]);




////////////////////

////////////////////

////////////////////

////////////////////



//함수 정의 부분


void Func(int _arr[5][5])

{


int col = 0, row = 0;

//세로 //가로


for (col = 0; col < 5; ++col)

{

for (row = 0; row < 5; ++row)

{

printf("%d ", _arr[col][row]);

}

printf("\n");



}



}



//void PrintArray1D(int* _arr)

//void PrintArray1D(int _arr[])

void PrintArray1D(int _arr[] , int _len) //배열의 길이도 매개변수로 받는다.

{


printf("_arr Size : %d byte\n", sizeof(_arr));  //포인터는 4바이트


int cnt = 0;

for (cnt = 0; cnt < _len; ++cnt)

printf("%d ", _arr[cnt]);


printf("\n");



}



//

//void PrintArray1D(int _arr[5])

//{

//

// int cnt = 0;

// for (cnt = 0; cnt < 5; ++cnt)

// printf("%d ", _arr[cnt]);

//

// printf("\n");

//

//

//}




//void PrintArray2D(int _arr[5][5])

//void PrintArray2D(int _arr[5][5]) //매개변수 정보 2개를 다 제공하고있음.

void PrintArray2D(int _arr[][5] , int _colcnt)

{


int col = 0, row = 0;

//세로 //가로


for (col = 0; col < _colcnt; ++col)

{

for (row = 0; row < 5; ++row)

{

printf("%d ", _arr[col][row]);

}

printf("\n");



}



}

//{

//

// int col = 0, row = 0;

// //세로 //가로

//

// for (col = 0; col < 5; ++col)

// {

// for (row = 0; row < 5; ++row)

// {

// printf("%d ", _arr[col][row]);

// }

// printf("\n");

//

//

// }

//

//

//}





//메인 함수 

int main(void)

{


int arr[5][5] = {


{ 11 , 12, 13 , 14, 15 },

{ 21 , 22, 23 , 24, 25 },

{ 31 , 32, 33 , 34, 35 },

{ 41 , 42, 43 , 44, 45 },

{ 51 , 52, 53 , 54, 55 },

};



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



//int arr2D[5][5]

int arr2D[3][5] = {


{ 11 , 12, 13 , 14, 15 },

{ 21 , 22, 23 , 24, 25 },

{ 31 , 32, 33 , 34, 35 },

//{ 41 , 42, 43 , 44, 45 },

//{ 51 , 52, 53 , 54, 55 },

};



//int arr2[3][2] = { 0, };




//Func(arr);


//Func(arr2);


//int arr2[5][5] = arr; //요렇겐 못들어감.  배열을 초기화하는 부분이죠. 

//얘값으론 초기화를 못해요. 그 이유는 arr는 포인터라서. 배열의 이름이라서. 

//자 그러면, 얘를 그러면 포인터로 저장하면 되겠느냐?

//int** pArr = arr; //요래도 워닝이 뜬다. 2차원 배열을 만들어서 2차원 포인터에 전달하고싶어하는건데. 

//워닝이 뜬거죠. 더블포인터에 포인터는 받아졌는데 정보가 부족해서.. 무슨 말이냐면 지금 우리가


int* pArr1D = arr1D;

//PrintArray1D(pArr1D);



int* pArr1D2 = arr1D; //C에서는 대입 불가

PrintArray1D(pArr1D , sizeof(arr1D)/ sizeof(int)); //  뭐시기 , 자료형의 크기만큼을 나눠야 개수가 나옴.


int** pArr2D = arr2D;



//PrintArray2D(pArr2D);



PrintArray2D(pArr2D , 3);


PrintArray2D(pArr1D, 70);



/*


int col = 0, row = 0;

//세로 //가로


for (col = 0; col < 5; ++col)

{

for (row = 0; row < 5; ++row)

{

printf("%d ", _arr[col][row]);

}

printf("\n");



} //요렇게하면 출력도 안되고 메모리 뻗음. 이유는? 함수에 있는건 출력이 되고 여기에 있는건 왜 출력이 안되는가?

//주소값만 저장했지. 가로갯수를 몰라서 뻗는거임. 옵셋값을 몰라서 ...

//세로갯수는 []이렇게해도 가로갯수를 []이렇게 적으면 뻗는다. 가로갯수가 반드시 필요하다 즉 옵셋값을 반드시 알아야한다.


**/




//PrintArray2D(pArr2D);



return 0;


}