배열과 포인터 - 3

char형 포인터, 포인터와 배열의 상관관계, 포인터 배열, 이중 포인터.

  • 학습 목표
    1. char형 포인터를 이용하여 문자열 다루기.
    2. 포인터를 배열 형식으로, 배열을 포인터 형식으로 참조하기.
    3. 포인터 배열 사용.
    4. 이중 포인터에 대한 이해.

주요 용어

  • char형 포인터 : 문자열 처리에 효과적인 포인터.
  • 포인터 배열 : 포인터가 여러 개 사용될 때 포인터를 배열형식으로 사용.
  • 이중 포인터 : 자료가 있는 곳을 이중으로 가리키는 포인터.

char형 포인터

  • 포인터는 문자열 처리에 효과적임.
  • 문자열 처리에 char형 포인터 사용하면 효율성이 극대화 됨.
    • char *cp = "COMPUTER";

char 포인터의 기억공간 표현과 예

 

char 포인터의 기억공간 표현과 예

 

  #include <stdio.h>

  int main()
  {
    //  char형 포인터 변수 cp의 값은 COMPUTER가 수록된 시작주소.
    char *cp = "COMPUTER";
    int i = 0;

    do
    {
      printf("*(cp + %d) : %c\n", i, *(cp + i));
    } while (*(cp + i++) != 0); //  *(cp + i)를 구한 후 1 증가.

    return 0;
  }
  /**
   * *(cp + 0) : C
   * *(cp + 1) : O
   * *(cp + 2) : M
   * *(cp + 3) : P
   * *(cp + 4) : U
   * *(cp + 5) : T
   * *(cp + 6) : E
   * *(cp + 7) : R
   * *(cp + 8) : 
  */

포인터와 배열의 관계

포인터를 이용한 1차원 배열의 참조와 예.

 

포인터를 이용한 1차원 배열의 참조와 예.

  #include <stdio.h>

  void main()
  {
    static int a[] = {10, 20, 30, 40, 50};
    int *pt, b, c, d;

    // 배열명을 사용하여 배열의 시작주소를 할당 -> a[0]
    pt = a;

    // a[0] + a[3] = 10 + 40 = 50
    b = *pt + *(pt + 3);

    //  포인터를 1 이동 a[1]
    pt++;

    //  a[1] + a[4] = 20 + 50 = 70
    c = *pt + *(pt + 3);

    //  a[1] + 3 = 23
    d = *pt + 3;

    printf("b = %d, c = %d, d = %d\n", b, c, d);
    //  b = 50, c = 70, d = 23
  }

포인터를 이용한 2차원 배열의 참조와 예.

 

포인터를 이용한 2차원 배열의 참조와 예

#include <stdio.h>
void main()
{
  static a[3][3] = {
      {1, 2, 3}
    , {4, 5, 6}
    , {7, 8, -9}
  };
  int *pt;

  //  pt = a 또는 pa = &a[0][0]과 동일
  pt = a[0];

  while (*pt != -9)
  {
    printf("%d ", *pt);
    pt++;
  }
}

포인터와 배열은 상호 호환적.

  int A[] = {1, 2, 3, 4, 5};
  int *p, i;
  // -->>
  A + i == &A[i];
  A[i] == *(A + i);
  *( p + i ) == p[i];
  #include <stdio.h>

  void main()
  {
    char A[] = "ARRAY";
    char *p = "POINTER";
    int i;

    for (i = 0; i < 5; i++)
    {
      //  배열을 포인터 형식으로 참조.
      printf("*(A + %d) : %c\n", i, *(A + i));
    }

    for (i = 0; i < 7; i++)
    {
      //  포인터를 배열 형식으로 참조.
      printf("p[%d] : %c\n", i, p[i]);
    }
  }

포인터와 배열의 관계

  • 포인터와 배열의 값 변경
    • 배열 : A[i]에서 A++, A--로 값 변경 불가.
    • 포인터 : *p에서 p++, p--로 값 변경 가능.
  • 배열과 포인터의 기억공간 확보
    • 배열
      • 기억공간 중 자료여역을 고정적으로 확보.
    • 포인터
      • 기억공간 중 자료영역을 유동적으로 확보.
        • 필요할 때만 자료용 기억 공간을 확보.
        • 자료의 개수가 가변적인 경우 효과적.
    • 포인터가 배열보다 활용의 폭이 넓다.

포인터 배열

포인터 배열 -> 포인터의 집합.

  • 포인터가 여러 개 사용될 때 포인터 배열로 선언.
  • 주로 문자열 배열 처리에 사용.
    • char *str1, *str2, *str3; -> char *strs[3];

포인터 배열 선언과 기억공간 표현

 

포인터 배열 선언과 기억공간 표현

포인터 배열 사용 예

  #include <stdio.h>

void main()
{

  int a[] = {1, 2, 3, 4};
  int b[] = {5, 6, 7, 8};

  // 포인터 배열의 선언.
  int *PA[2];
  //  배열 a[]의 시작주소를 포인터 배열요소에 전달.
  PA[0] = a;
  //  배열 b[]의 시작주소를 포인터 배열요소에 전달.
  PA[1] = b;

  printf("*(PA[0]) = %d\n", *(PA[0]));         //  1
  printf("*(PA[0] + 1) = %d\n", *(PA[0] + 1)); //  2

  printf("*PA[1] = %d\n", *PA[1]);           //  5
  printf("*PA[1] + 15 = %d\n", *PA[1] + 15); //  20
}

이중 포인터 (Pointer to pointer)

자료가 있는 곳을 이중으로 가리키는 포인터.
이중 포인터가 가리키는 주소에 데이터가 아닌 주소 값이 들어 있음.

이중 포인터의 선언

  • 형식 : int **p;
  • 의미 : 포인터 변수에 다시 포인터를 지정하는 것으로, 포인터에 대한 포인터.
    • P : 기억공간 주소.
    • *P : 주소 P에 수록되어 있는 값. 이 값이 주소로 사용 됨.
    • **P : 주소가 *P인 곳에 수록되어 있는 int형 데이터 값.
  #include <stdio.h>

  void main()
  {
    char a = 'A', *p, **pp;

    //  포인터 변수에 일반변수 a의 주소 할당.
    p = &a;

    //  이중 포인터변수에 포인터변수 p의 주소 할당.
    pp = &p;

    printf("**pp = %c", **pp);
  }

 

이중 포인터의 선언


728x90
반응형

'Language > C' 카테고리의 다른 글

[C] 구조체와 공용체 - 2  (0) 2021.01.01
[C] 구조체와 공용체 -1  (0) 2020.12.27
[C] 배열과 포인터 - 2  (0) 2020.12.27
[C] 배열과 포인터 - 1  (0) 2020.12.25
[C] 함수와 기억 클래스 - 2  (0) 2020.12.25

배열의 개념에 대해 알아보고, 배열의 정의와 선언 형태, 배열과 기억공간의 표현에 대해 알아본다.

  • 학습 목표

    1. 배열을 선언하고 초기화.
    2. 배열의 요소를 참조.
    3. 배열과 기억공간의 표현을 이해.
    4. char형 배열을 이해.

주요 용어

  • 배열 : 동일한 자료형으 ㅣ값들이 순서적으로 하나의 이름(배열명)에 모여있는 것으로, 같은 이름을 갖는 하나 이상의 변수 리스트.
  • 1차원 배열 : 배열의 첨자가 하나만 있는 배열.
  • 2차원 배열 : 배열의 첨자가 2개인 배열.
  • 3차원 배열 : 배열의 첨자가 3개인 배열.
  • char형 배열 : 문자열을 처리하기 위해 사용되는 배열.

배열의 개념

n개의 자료를 처리하기 위해, n개의 변수를 만들고 모든 변수 이름을 기억하고 자료를 처리하기는 복잡함. ->
일관성 있고 효율적인 새료운 변수릐 필요

  • 하나의 변수 이름에 순서에 의한 번호 부여.
  • 변수명[0], 변수명[2], ...
  • 효율적인 자료 처리 가능.

배열의 정의와 형태

  • 배열의 정의.
    • 동일한 자료형을 갖는 자료들의 리스트.
    • 배열의 각 요소는 하나의 변수로 취급.
    • 배열은 배열명첨자로 구분.
  • 배열 선언 형태.
    • 1차원 배열.
    • 2차원 배열.
    • 3차원 배열.

1차원 배열

  • 배열의 첨자가 하나만 있는 배열.
  • 첨자의 개수는 배열 전체의 구성요소의 개수를 의미.
  • 배열의 각 요소는 배열명과 첨자로 구분.
    • 첨자는 0 부터 시작.
  • 배열의 각 요소는 배열명과 첨자로 구분.
    • 자료형과 기억 클래스는 갖는다.

선언

  • 형식 : 자료형 배열명 [개수]
  • 사용 예 : int a [10]
  • 의미 : 1차원 배열로서, 배열명은 a, 크기는 10, 정수 값이 기억됨.

1차원 배열의 기억 공간 표현

1차원 배열의 기억 공간 표현

1차원 배열의 초기화

배열을 선언하면 기억공간을 초기화 해야 함.

  • 초기화 방법.

    1. 배열선언 후 초기값 할당.

      •  int arr[4];  // -> 반드시 배열의 크기를 지정해야 함.
         arr[0] = 10;
         arr[1] = 20;
         arr[2] = 30;
         arr[3] = 40;
    2. 배열선언과 동시에 초기값 할당.

      •  int arr[4] = {10, 20, 30, 40};      //  -> 배열의 각 요소에 초기 값 할당.
         int arr[] = {10, 20, 30, 40};       //  -> 배열의 크기 생량 가능.
         int arr[4] = {10, 20, 30,};         //  -> arr[3] = 0으로 초기화.
         int arr[4] = {10, , 30, 40};        //  -> 에러 발생.
         int arr[4] = {10, 20, 30, 40, 50};  //  -> 에러
    3. 외부로부터 자료를 입력받아 초기화.

      •  int x[10];
         for( i = 0; i < 10; i++ ) {
           scanf("%d", &x[i]);
         }
  • 1차원 배열의 초기화 후 기억공간의 표현
    int arr[5] = {10, 20, 30, 40, 50};

1차원 배열의 초기화 후 기억공간의 표현

 

  • EX 1

    • #include <stdio.h>
      
      int main()
      {
        //  배열 선언과 초기화
        int arr1[4] = {10, 20, 30, 40};
        int arr2[] = {10, 20, 30, 40};
        int arr3[4] = {10, 20};
        int arr4[4] = {0};
        int i;
      
        printf("\narr1 ->\n\t");
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr1[i]);
        }
        printf("\narr2 ->\n\t");
      
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr2[i]);
        }
        printf("\narr3 ->\n\t");
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr3[i]);
        }
        printf("\narr4 ->\n\t");
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr4[i]);
        }
        printf("\n");
      
        return 0;
      }
  • EX 2

    •   #include <stdio.h>
      
        int main()
        {
          //  1차원 배열 선언과 초기화
          static int x[] = {1, 2, 3, 4};
          static int y[] = {10, 20, 30, 40};
      
          int i, z[4];
      
          for (i = 0; i < 4; ++i)
            z[i] = x[i] + y[3 - i];
      
          printf("SUM OF OTHER SIDE OF EACH ARRAY\n");
      
          for (i = 0; i < 4; ++i)
            printf("%d + %d = %d\n", x[i], y[3 - i], z[i]);
      
          return 0;
        }

2차원 배열 선언

  • 형식 : 자료형 배열명[행의 수][열의 수]
  • 사용 예 : int a[3][4];
  • 의미 : 2차원 배열로, 배열 명은 a이고, 3행 4열로 됨 12개의 요소를 가진 정수형 배열.

2차원 배열의 선언과 초기화

  int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
  int arr[3][3] = {
      {1, 2, 3}
    , {4, 5, 6}
    , {7, 8, 9}
  };

2차원 배열의 기억공간 표현

 

2차원 배열의 기억공간 표현

 

2차원 배열의 사용 예

  #include <stdio.h>

  int main()
  {
    static int score[4][3] = {
        {90, 90, 90},
        {80, 80, 80},
        {70, 70, 70},
        {60, 60, 60}};
    int sum, i, j;

    printf("No\tA\tB\tC\tSUM\n");

    for (i = 0; i < 4; ++i)
    {
      sum = 0;
      printf("%3d", i + 1);

      for (j = 0; j < 3; j++)
      {
        printf("\t%3d", score[i][j]);
        sum += score[i][j];
      }
      printf("\t%3d\n", sum);
    }

    return 0;
  }

3차원 배열의 선언

  • 형식 : 자료형 배열명 [면의 수] [행의 수] [열의 수];
  • 사용 예 : int a[2][3][4];
  • 의미 : 3차원 배열로서, 배열 명은 a이고, 2면 3행 4열로 된,
    24개 요소를 가진 정수형 배열.

3차원 배열의 초기화와 기억공간 표현

 

3차원 배열의 초기화와 기억공간 표현


char형 배열

  • 형식 : char 배열명[문자열 길이 + 1]
  • 사용 예 : char str[12]
  • 의미 : 배열명 str, 12문자 길이를 가진 char 형 배열.

char형 배열선언과 초기화

  char name[] = "JEAHA OH"; // 문자열 단위로 초기화
  char addr[] = {'S', 'E', 'O', 'U', 'L', '\0'}; // 문자 단위로 초기화. '\0'을 삽입 해야 함.

char형 배열 사용 예

  #include <stdio.h>

  int main()
  {
    char name[] = "JEAHA OH";
    char addr1[6] = {'S', 'E', 'O', 'U', 'L', '\0'}; // 마지막 요소 \0 삽입
    char addr2[6] = {'S', 'E', 'O', 'U', 'L'};       //  마지막 요소 \0을 삽입하지 않을 경우 쓰레기 값이 붙을 수 있음.

    printf("\n name : %s", name);
    printf("\n addr1 : %s", addr1);
    printf("\n addr2 : %s", addr2);
    return 0;
  }
  #include <stdio.h>

  int main()
  {
    char string[50];
    int i = 0;

    printf("\t INSERT SOMETHING STRING >> ");
    scanf("%s", string);

    printf("RECEIVED STRING : %s\n", string);
    printf("PRINT AS CHARACTER : ");

    while (string[i] != '\0')
    {
      printf("%c", string[i]);
      i++;
    }
    printf("\n");
    return 0;
  }

함수와 배열

  • 배열을 함수의 매개변수로 사용할 경우
    • 함수 호출 시 배열명만 명시하여 호출.
    •   int score[2][5] = {{1, 2, 3, 4, 5}, {1, 1, 1, 1, 1}};
        score_sum( score, 2, 5);
  • 함수의 헤더에는
    • 1차원 배열의 경우 크기 생략 가능
    • 다차원 배열의 경우 가장 높은 차원의 크기 생략 가능.
  #include <stdio.h>

  void score_sum(int gr[][5], int, int);

  int main()
  {
    int score[2][5] = {
        {10, 20, 30, 40, 50},
        {10, 10, 10, 10, 10}};

    score_sum(score, 2, 5);

    return 0;
  }

  void score_sum(int gr[][5], int row, int column)
  {
    int sum[2] = {0};
    int i, j;

    for (i = 0; i < row; i++)
    {
      for (j = 0; j < column; j++)
      {
        sum[i] += gr[i][j];
        printf("SUM[%d] = %d\n", i, sum[i]);
      }
    }

    printf("\n");
  }

728x90
반응형

'Language > C' 카테고리의 다른 글

[C] 배열과 포인터 - 3  (0) 2020.12.27
[C] 배열과 포인터 - 2  (0) 2020.12.27
[C] 함수와 기억 클래스 - 2  (0) 2020.12.25
[C] 함수와 기억 클래스 - 1  (0) 2020.12.20
[C] 선택 제어문과 반복 제어문  (0) 2020.12.20

+ Recent posts