본문으로 바로가기

C언어_교환법칙, (2,3)차원 배열, 더블 포인터의 이해

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

- 교환 법칙 -


#include <stdio.h>  // 이런 문법을 허용 한다만 알면 된다. 누가 이런식으로 코딩했을 시 알아 봐야 하기 때문에 알려준다.

int main(void)
{
  int A[5= {12345};  //1차원 배열 선언 후 초기화  

  printf("[%d]\n",A[2]);    //그렇다면 배열에서의 교환법칙 이란? 배열에서의 교환법칙. 즉, 누가 이런식으로 코딩하면 맞긴 맞는 코딩.
  printf("[%d]\n",2[A]);    


  return 0;
}
/*
교환법칙
A + B = B + A 
A * B = B * A

*/


- 2차원 배열 추가 설명 -


#include <stdio.h>

int main(void)
{
  int A[3][4=
  {
    {},
    {},
    {}
  };

  return 0;
}

/*
A[1] + 2 란 즉, &A[1][2] 와 같다. 또한 저것을 좀더 풀어쓰면 *(A+2) + 2 도 또한 &A[1][2] 와 같다.

&A[1][2]
A[1] + 2
*(A+2) + 2

여기서 이제 값을 바꾸고 싶으면 *만 전부 시켜주면 값이 될 것임을 안다.

A[1][2]
*(A[1] + 2)
*(*(A+2) + 2)



*/




- 2차원 배열 예제 -

#include <stdio.h>

int main(void)
{
  int i, j;

  /*2차원 배열 초기화의 예 1*/
  int arr1[3][3=
  {
    { 123 },
    { 456 },
    { 789 }
  };

  /*2차원 배열 초기화의 예 2*/
  int arr2[3][3=
  {
    { 1 },
    { 45 },
    { 789 }
  };

  /*2차원 배열 초기화의 예 3*/
  int arr3[3][3= { 1234567 };

  for (i = 0; i < 3; i++)
  {
    for (j = 0; j < 3; ++j)
    {
      printf("%d ", arr1[i][j]);
    }

    printf("\n");
  }

  printf("\n");

  for (i = 0; i<3; i++)
  {
    for (j = 0; j < 3; ++j)
    {
      printf("%d ", arr2[i][j]);
    }

    printf("\n");
  }

  printf("\n");

  for (i = 0; i < 3; i++)
  {
    for (j = 0; j < 3; ++j)
    {
      printf("%d ", arr3[i][j]);
    }

    printf("\n");
  }

  return 0;
}



- 3차원 배열 -

#include <stdio.h>

int main(void)
{
  int mean = 0, i, j;
  int record[3][3][2= 
  {
    {
      {7080},
      {9490},
      {7085}
    },
    {
      {8390},
      {9560},
      {9082}
    },
    {
      {9889},
      {9994},
      {9187}
    }
  };

  for(i = 0; i < 3; ++i)
  {
    for(j = 0; j < 2; ++j)
    {
      mean += record[0][i][j];
    }
  }
  
  printf("A 학급 전체 평균 : %g\n", (double)mean/6);

  mean = 0;
  for(i = 0; i < 3; ++i)
  {
    for(j = 0; j < 2; ++j)
    {
      mean += record[1][i][j];
    }
  }

  printf("B 학급 전체 평균 : %g\n", (double)mean/6);

  mean = 0;
  for(i = 0; i < 3; ++i)
  {
    for(j = 0; j < 2; ++j)
    {
      mean += record[2][i][j];
    }
  }
  
  printf("C 학급 전체 평균 : %g\n", (double)mean/6);
  
  return 0;
}

/*
개념상으로 보면 배열은
[]  1차원 배열  줄 을 의미.
[][]  2차원 배열  판 을 의미
[][][]  3차원 배열  개 를 의미

즉, 개념상으로 따지면 [][] 2차원 배열에서의 왼쪽 대괄호는 1차원 배열이 몇개 있느냐.
[][][] 3차원 배열에서는 맨 왼쪽 대괄호가 2차원 배열이 몇개 있느냐가 되는 것 이다. 



이 예제로 입사 문제를 냈을 경우 변수하나 선언하여 3중 for문으로 표현해봐라.
*/



- 더블 포인터의 이해 -

#include <stdio.h>

int main(void)
{
  int A = 3;
  int* p = &A;
  int** pp = &p;  //p의 주소를 가진다. 그냥 p를 적게되면 p는 A의 주소값을 가지기에 A주소가 들어간다.
  int*** ppp = &pp;

  printf("%08X\n",&A);
  printf("%08X\n",&p);
  printf("%08X\n\n",&pp);

  printf("%08X\n",A);  //3을 16진수로 표현
  printf("%08X\n",p);  //p는 A의 주소를 가지니까 A주소 값이 출력
  printf("%08X\n\n",pp);  //pp는 p의 주소를 가지니까 p주소 값이 출력

  //printf("%08X\n",A);  //얘는 값과 주소 만 할 수 있고
  printf("%08X\n",*p);  //p와 pp는 *을 붙일 수 있다.
  printf("%08X\n\n",*pp);  //p의 주소 값 ( A 의 주소값 )

  //printf("%08X\n",A);  
  //printf("%08X\n",*p);  
  printf("%08X\n\n",**pp);  //★1008 1004 1000 이라고 주소값을 임의로 뒀다고 한다면.. 그림으로 그려볼 것.

  //printf("%08X\n",A);  //얘는 값과 주소 만 할 수 있고
  //printf("%08X\n",*p);  //p와 pp는 *을 붙일 수 있다.
  //printf("%08X\n",**pp);
  printf("%08X\n",***ppp);
  
  return 0;
}

/*
포인터와 배열은 그림으로 표현할 줄 알아야 한다.
무조건 한번씩 그려볼 것.

*/



- 더블 포인터 예제 -

#include <stdio.h>

int main (void)
{
  double num = 3.14;
  double *ptr = &num;
  double **dptr = &ptr;
  double *ptr2;  //위험 ! 누구를 가르키는 지 모른다. 그러므로  = 0 으로 NULL 로 초기화를 하는 습관 들일 것.

  printf("%9p %9p\n", ptr, *dptr);
  printf("%9g %9g\n", num, **dptr);
  ptr2 = *dptr;  //ptr2 = ptr 과 같은 문장.
  *ptr2 = 10.99;
  printf("%9g %9g\n", num, **dptr);

  return 0;
}



- 더블 포인터 예제 2 -


#include <stdio.h>

void swapintptr(int *p1, int *p2)
{
  int *temp = p1;
  p1 = p2;
  p2 = temp;

}

int main(void)
{
  int num1 = 10, num2 = 20;
  int *ptr1, *ptr2;

  ptr1 = &num1, ptr2 = &num2;

  printf("*ptr1, *ptr2 : %d %d\n", *ptr1, *ptr2);

  swapintptr(ptr1, ptr2);

  printf("*ptr1, *ptr2 : %d %d\n", *ptr1, *ptr2);

  return 0;
}