#include <stdio.h>

int main()
{
  int i,j;
  int array[3][4={{15,23,45,56},
            {34,52,76,23},
            {43,62,91,84}};
  for (i=0;i<3;i++)
  {
    for(j =0;j<4;j++)
    {
      printf("%d ",array[i][j]);
    }
    printf("\n");
  }
  
  printf("array         :  %08X\n",array);
  printf("&array[0][0]+1:  %08X\n",&array[0][0]+1);
  printf("array[0]+1    :  %08X\n",array[0]+1);
  printf("&array[0]+1   :  %08X\n",&array[0]+1);
  printf("array+1       :  %08X\n",array+1);
  printf("&array+1      :  %08X\n",&array+1);
  printf("*(array[1])   :  %d\n",*(array[1]));
  printf("*(*(array+1)) :  %d\n",*(*(array+1)));
    
  return 0;
}

15 23 45 56
34 52 76 23
43 62 91 84
array                 :  BFFFFA04
&array[0][0]+1  :  BFFFFA08
array[0]+1         :  BFFFFA08
&array[0]+1      :  BFFFFA14
array+1             :  BFFFFA14
&array+1           :  BFFFFA34
*(array[1])        :  34
*(*(array+1))      :  34

실제로는 행렬이 존재하는것이 아니라 표현만 하는것 
{15,23,45,56},{34,52,76,23}, {43,62,91,84} 주소는 옆으로 쭉 나열만 된다.

다차원 배열 이므로 array[1] 을 적으면 값을 표현하는것이 아니라 주소를 표현하는것이 된다.
*(array[1])이라고 한다면 값을 뜻함 
*(array+1)이 array+1랑 같음 *(*(array+1)) 이라고 써야 값이된다.
array[0]+1은 값이 아니라 주소 , +1을 하면 다음번 주소의 값이지만 &array[0]이라고 하면 행전체의 주소이다. +1을 하면 다음행으로 넘어감


array 와 &array[0]은 같다. 첫번째 원소 의 주소와 같다. 
array[0] 도 마찬가지로 첫번째 원소의 주소이다. 값이 아님 다차원배열이므로 값이
아닌 주소이다. array[0][0]이 값이고 &array[0][0]라고 하면 이역시 첫번째 원소의
주소를 가르킨다. 

&array[0][0] 과 a[0], *(a+0)+0 은 같은 주소를 가리킨다. 만약에 값을 표현하면
array[0][0], *(a[0]), *(*(a+0)+0) 은 같은 값이 된다.

&array 이라고 하면 배열 전체의 주소를 가르키게 된다. 이경우에 +1을 하게되면
&array+1 에서 마지막 84의 번지의 주소가 아님 .그 다음 번지를 가르킨다.