Busan IT/공장내 Network2015. 4. 16. 17:35

포인터를 활용한 1/2차원 배열의 값과 주소

 

학습목표

 

1차원 배열의 값과 주소에 대해 이해하고 여러 가지 형태를 사용하여 출력할 수 있다.

2차원 배열의 값과 주소에 대해 이해하고 여러 가지 형태를 사용하여 출력할 수 있다.

 

지난 시간에 이어 2차원 배열에 대하여 수업을 해 보아요. \=_=/ \=_=/

시간이 남아 퓨전...(드래곤볼 참조)

 

... \=_=/ \=_=/

... o-(=_=)o- -o(=_=)-o

... /=_=/ \=_=\

 

 

배열에서 배열의 이름자체는 배열의 주소 값을 나타낸다.

ex) A[5]; printf("%p", A); -> A의 주소 출력

 

 

int A[5]라는 배열이 있다고 하면,


A는 주소 값으로써 상수이고 p는 주소 변수이다.

 

p가 변수임을 확인해 보자.


p는 대입연산자(=)를 활용하여 그 값을 변할 수 있는 주소 변수임을 알 수 있다.

하지만 배열 A 또는 B는 주소 값을 나타내는 주소 상수로써 값을 변화 시킬 수 없다.

변수와 상수의 차이라는 점을 제외하고는 배열의 이름과 주소 상수는 똑같이 사용할 수 있다.

 

/*** 네트워크 삼천포 ***/





natservice가 있을 때 이것을 삭제해야 컴퓨터가 정상적으로 가동한다.

 

삭제하는 방법 http://todaki.tistory.com/2646

 

각설! 네트워크 삼천포 break;

--------------------------------------------------------------------------

 

배열의 타입은 int[X]이다. // X는 선언 시 입력한 상수.

 

const를 어떻게 쓰느냐에 따라 고정되는 값이 다르다.

 

 

포인터 변수 int * p에서,

 

const* 앞에 붙이면 *가 가리키는 값을 수정할 수 없고,

const를 변수명 바로 앞에 붙이면 가리키는 주소 값을 바꿀 수 없게 된다.


 

2차원 배열로 넘어가서,

 

우선 for문을 사용하여 값과


 

차원수만큼의 대괄호([])가 있으면 그것은 값을 뜻한다.

차원수만큼의 포인터(*)가 있으면 그것은 값을 뜻한다.

그러므로 대괄호의 역할을 포인터가 할 수 있다. 또한 포인터의 역할을 대괄호가 할 수 있다.

정리하면 대괄호의 수 + 포인터의 수 = 차원수 가 되면 값을 뜻한다.

대괄호의 수와 포인터의 수가 차원수보다 작게 되면 그것은 주소를 뜻한다.

 

코드와 결과 값!

 

/*** 2dimArry.c ***/

#include <stdio.h>

int main(void)
{
  /*** 사용자의 가독성을 생각한 배열 코딩 ***/

  int A[2][3]= {  {1,2,3},
      {4,5,6}
               };
  int iCnt1;  //행의 출력을 위한 카운터   
  int iCnt2;  //열의 출력을 위한 카운터

  for(iCnt1=0; iCnt1<2; ++iCnt1)
  {
    for(iCnt2=0; iCnt2<3; ++iCnt2)
    {
      printf("[%d]", A[iCnt1][iCnt2]);    
    }
    putchar('\n');
  }

  putchar('\n');
  
  for(iCnt1=0; iCnt1<2; ++iCnt1)
  {
    for(iCnt2=0; iCnt2<3; ++iCnt2)
    {
      printf("[%08X]"&A[iCnt1][iCnt2]);    
    }
    putchar('\n');
  }
  putchar('\n');

  printf("A[0][0]의 값은    [%d]입니다.\n", A[0][0]);
  printf("*(A[0]+0)의 값은  [%d]입니다.\n", *(A[0]+0));
  printf("*((*A+0)+0)의 값은  [%d]입니다.\n", *((*A+0)+0));
  printf("*(A[0])의 값은    [%d]입니다.\n", *(A[0]));
  printf("**A의 값은    [%d]입니다.\n\n", **A);

  printf("A[1][2]의 값은    [%d]입니다.\n", A[1][2]);
  printf("*(A[1]+2)의 값은  [%d]입니다.\n", *(A[1]+2));
  printf("*((*A+2)+3)의 값은  [%d]입니다.\n\n", *((*A+2)+3));

  printf("A[0][0]의 주소는  [%08X]입니다.\n"&A[0][0]);
  printf("(A[0]+0)의 주소는  [%08X]입니다.\n", (A[0]+0));
  printf("((A+0)+0)의 주소는  [%08X]입니다.\n", ((A+0)+0));


  return 0;

}

 


 


 

 

 

반응형
Posted by newind2000