본문으로 바로가기

C언어_다차원 배열

category 개발자/C 언어 2015. 4. 17. 16:09

- 다차원 배열 예제 -

#include <stdio.h>

int main(void)
{
  int arr1[3][4];
  int arr2[7][9];

  printf("세로 3, 가로 4 : %d\n", sizeof(arr1));
  printf("세로 7, 가로 9 : %d\n", sizeof(arr2));

  return 0;
}




- 다차원 배열 예제2 -

#include <stdio.h>

int main(void)
{
  int villa[4][2];
  int popu, i, j;

  //가구별 거주 인원 입력 받기
  for(i = 0; i < 4; i++)
  {
    for(j = 0; j < 2; j++)
    {
      printf("%d층 %d호 인구수: ", i+1, j+1);
      scanf("%d",&villa[i][j]);
    }
  }

  //빌라의 층별 인구수 출력하기
  for(i = 0; i < 4; i++)
  {
    popu = 0;
    popu += villa[i][0];
    popu += villa[i][1];
    printf("%d층 인구수 : %d\n", i+1, popu);
  }
  return 0;
}


- 다차원 배열 기본형 준비 -

#include <stdio.h>

#define N  3
#define M  4

int main(void)
{
  int iArry[N][M];
  int iCntN;
  int iCntM;
  int iCnt;  //입력 자동화

  for(iCntN = 0, iCnt = 1; iCntN < N; ++iCntN)  //입력, 여기서 iCnt = 1 초기화
  {
    for(iCntM = 0; iCntM < M; ++iCntM)
    {
      //printf("숫자를 입력하세요 : ");  //수동
      //scanf("%d",&iArry[iCntN][iCntM]);
      iArry[iCntN][iCntM] = iCnt;    //자동 ( (0,0) = 1, (0,1) = 2 .... (0,3) = 4, (1,0) = 5,....) 
      ++iCnt;
    }
  }

  for(iCntN = 0; iCntN < N; ++iCntN)  //출력
  {
    for(iCntM = 0; iCntM < M; ++iCntM)
    {
      printf("[%5d] ",iArry[iCntN][iCntM]);//그 행[iCntN]의 열을 전부 출력
    }

    putchar('\n');
  }

  for(iCntN = 0; iCntN < N; ++iCntN)  //주소 출력
  {
    for(iCntM = 0; iCntM < M; ++iCntM)
    {
      printf("[%08X] ",&iArry[iCntN][iCntM]);
    }

    putchar('\n');
  }//즉, 메모리 저장할 때는 한줄로 되있음을 컴파일 해서 출력해보면 알 수 있다.
   //이러한 역활을 컴파일이 해준다.

  //0행, 0열 (즉, iArry의 주소 값)
  printf("[%08X]\n",iArry+0);  
  printf("[%08X]\n",iArry[0]);  //이렇게 해도 iArry의 시작주소가 나온다.
  printf("[%08X]\n\n",&iArry[0][0]);

  //1,0
  printf("[%08X]\n",iArry+1);
  printf("[%08X]\n",iArry[1]);  
  printf("[%08X]\n\n",&iArry[1][0]);

  //2,0
  printf("[%08X]\n",iArry+2);  //세로로 2칸 이동(줄의 크기 만큼 증가)
  printf("[%08X]\n",iArry[2]);  //여기서 뒤에 +1 을 하면 가로로 1칸 이동
  printf("[%08X]\n\n",&iArry[2][0]);

  //즉, 2차원 배열에서는 A + 1 은 줄 이동이 발생하고, 1차원 배열에서는 4byte 이동이 발생했다.(int형이라 가정했을 시)
  //A[0] + 1 저 가로가 한 칸을 의미 한다. (즉, A[0][1] 과 같음을 알 수 있다.)
  printf("[%08X]\n\n",iArry[0]+2);  //가로로 2칸 이동했음을 알 수 있다.


  printf("[%08X]\n",&iArry+1);  //배열 이름에 &를 하게 되면 그 배열 전체를 의미한다. 즉, 48바이트의 크기의 배열을 한칸 뛰어넘어라.

//1차원 배열에서는  1. &배열 이름 -> 배열 전체(한 줄) 2. 배열 이름 -> 배열 1개(여기서 + 1 을 해주면 하나만 뛰어넘는다.(int형이라 가정하면 4바이트 건너뜀))
//다시 정리해서 말하자면 2차원 배열에서는 1. &배열 이름 -> 배열 전체(2차원 배열), 2. 배열 이름 -> 배열 1줄(1차원 배열)(세로로 이동), 3. 배열 이름[] -> 배열 1개(가로로 이동)
//3차원 배열에서는 1. &배열 이름 -> 배열 전체(3차원 배열), 2. 배열 이름 -> 배열 1판(2차원배열), 3. 배열 이름[] -> 배열 1줄(1차원 배열)(세로로 이동), 4. 배열 이름[][] -> 배열 1개(가로로 이동)
  return 0;
}




- 다차원 배열 기본형 준비 2 -

#include <stdio.h>

int main(void)
{
  int A[5= {12345};  //바로 초기화

  printf("1차원 배열 A의 주소는 ? : %08X\n",A);
  printf("1차원 배열 A의 주소는 ? : %08X\n",&A);
  printf("1차원 배열 A[0]의 주소는 ? : %08X\n\n",&A[0]);

  //같은 주소를 출력한다 해서 의미하는 바가 같다. 라는 것은 아니라는 것이다.
  printf("1차원 배열 A의 주소는 ? : %08X\n",A+1);
  printf("1차원 배열 A의 주소는 ? : %08X\n",&A+1);// 배열 전체를 뛰어넘고 나서 int형인 4바이트 증가.
  printf("1차원 배열 A의 주소는 ? : %08X\n\n",&A[0]+1);

  //심층 과정
  printf("%d\n",*A);
  printf("%d\n\n",A[0]);

  //즉, 저 심층 과정 공식이 성립한다는 것을 확인 할 수 있다.
  printf("%d\n",*(A+1));
  printf("%d\n\n",A[1]);  
  

  printf("%d\n",A+1);
  printf("%d\n",&A[1]);

  return 0;
}
/* *(&A[0]) == A[0] 과 같음을 알 수 있다.(그 주소값의 *(값) == 그 배열의 값) *과 &가 만나면 서로 상쇄됨을 알 수 있는 것이다.
저 위에 것을 좀더 심층과정을 겪어보자.
A + 1 = &A[0] + 1
= &A[0]
*A = *&A[0]
---> *A = A[0]
자, 공식이 하나 튀어 나왔다.
이것을 가지고 이제 우리는 그 배열의 값을 출력 시 2가지 방법으로 출력할 수 있음을 안다.
하나는 배열방식,
&A[2] = 3

두번째는 포인터방식,
*(A+2) = 3

자, 다시 한번 증명을 해보자.
*(A+1) = A[1]
&(*(A+1)) = &A[1]
---> A+1 = &A[1] ( 이것은 주소 값이 서로 같다라는 말 )

값을 출력할 때는 & 없이 배열만,
주소값은 무조건 &

즉, 정리하자면 5를 표현할 때 A[4] 로써 표현이 가능 하고 *(A + 4) 로도 표현이 가능하다.
*/