본문 바로가기
Ghost의 Linux C Note(노트)/Ghost의 Linux C언어 3차원 배열 포인터

다차원 배열 포인터는 달라?~~

by dark ghost 2012. 6. 1.
728x90
반응형

3차원 배열 포인터.

: 일반 적인 포인터는 1차원 배열과 같다. 즉 1차원 배열을 쓰면 포인터로 1차원 배열의 주소로 찾아 들어가 값을 가져 오거나 고칠수 있다. 하지만 배열이 다차원 배열이 되면 경우가 달라진다. 위에서도 언급 했듯이 포인터는 1차원 배열과 같기 때문에 만약 2차원 배열이 되면 그 때부터는 포인터로 배열의 주소로 출력을 할려고 하면 경고나 에러가 뜬다. 그래도 경고 정도라면 출력은 시킬수 있다. 그래서 만약의 경우 그래도 쓰일 일은 거의 없겠지만 있다면 다차원 배열 포인터를 써야 한다.

 

1. 위 소스는 다차원 배열 포인터의 소스이다. 거의 겉 모습은 배열과 같아 보인다. 여기서는 중요 한것이 포인터의 크기와 배열의 크기를 아는 것이 중요하다. 왜냐 하면 겉모습만 보면 배열이라고 생각하기 쉽기 때문이다.

int a[2][3][4] = {{{1,2,3,4,},

 {99,3,4,5},

 {3,4,5,6,},

{{77,5,4,3},

  {5,4,3,2},

  {4,3,2,1}}};

2. 정수형 배열 a 를 만들었다. 하지만 일반적인 배열과 달라 보인다. 일반적인 1차원 배열은 int a[30]; 이렇게 만들어 지는데 [30]은 크기를 30만큼 만든다는 뜻이다. 위의 코드는 3차원 배열로 a[2][3][4] 를 설정 한것이다. 3차원배열은 1차원 배열의 [] 안은 배열의 크기를 만들지만 3차원 배열에서는 약간 다르다.그리므이 소스를 보면 색깔별로 묶어 놨는데 그냥 묶어 논것은 아니고 연관이 있기 때문에 색깔별로 묶어 놨는데 a[2] [] 안의 2는 전체 적인 배열을 2개로 만들겠다는 것이고 [3] 은 1개의 배열안에 3개의 배열을 만들겠다. [4]는 원소로 1개의 배열 안에 4개씩 만든다는 것이다. 물론 글로 보면 이해가 안될 수도 있으므로 소스를 보고 색깔 별로 확인 해본다면 이해가 좀 될지도 모르겠다.

  printf("%d\n", sizeof (a));

3. printf 문은 배열 a의 크기를 알아보기 위해 사용된 구문이다. 

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

 printf("%08X\n", p+12);

 printf("%08X\n", a+1);

4. 위 printf 문은 사용 된 방법은 다르나 같은 결과의 주소가 나온다는 것을 보여주기 위한 코드이다. 2번째 코드에서 p+12는 p는 포인터 변수로서 배열 a를 담고 있는 변수다. 배열도 주소이고 포인터도 주소이므로 결과는 배열 a의 메모리 주소를 담고 있다.

 void test(int p3[][3][4])

5. 위 함수는 받는 인자가 얼핏 보면 배열처럼 보인다. 그러나 인자는 배열인 아닌 다차원 포인터이다. 배열과 차이점이라면 [] 맨 앞자리는 비우고 2 번째 [3]안은 반드시 채워야 한다. 이유는 일단 앞자리는 배열과 다르다는 것을 구분하기 위해서 비우지만 2번째 3번째는 배열의 크기가 얼만큼 되는 지를 알게 하기위해서 채우는 것이다. 그리고 왜 인자가 배열이 아니고 포인터인지는 나중에 결과로 확인 해 보겠다.

 printf("%d\n", sizeof (p3));

6. 위 printf 문은 받은 인자가 배열인지 포인터인지 확인하기 위해 크기를 알아보기 위해 사용된 구문이다.

 printf("%08X\n", p3+1);

7. 위 printf 문은 main 함수에서 주소를 출력했던 printf 문 같은 결과를 볼 수있게 하기 위한 구문이다. 즉 코드의 형태는 다르지만 같은 결과를 보여준다는 것은 형태가 달라도 같은 코드라는 것이다. 즉 하고 싶고 편한대로 골라서 구문을 사용 하면 된다는 것이다.

 

8. main 파일을 실행 시킨 화면이다. 96 이라고 출력된 화면은 main 에서 printf문에서 sizeof 를 출력시킨 결과로 배열 a의 크기는 96 Byte 라는 것을 알수 있고 나머지 주소를 출력 시키는 printf 문은 모두 같은 메모리 주소를 출력 시키는 것을 볼 수 있다. 그리고 4 라고 출력된 부분인 함수에서 인자로 받았던 (int p3[][3][4]) 의 메모리 크기로 96 Byte와는 많은 차이를 보이는데 이것으로  (int p3[][3][4]) 가 배열이 아니라 포인터라는 것을 알 수 있다. 포인터의 크기가 4Byte 이기 때문이다. 그리고 다차원 포인터는 일반적으로 main 함수에서는 쓸수가 없다. Only 함수 인자로서만 쓸수 있기 때문에 만약 사용 해야 된다면 함수 인자로 하여 다차원 포인터를 쓰기 바란다. 장점이라고 한다면 배열을 여러번 쓰기 힘든때 만약 쓰게 된다면 용량이 커지기 때문에 용량을 줄이기 위해서쓸수도 있을 것이다.

728x90
반응형

댓글