ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C Language] 43. 포인터 - 매개변수 처리 총정리
    CSE/C Language 2015. 8. 10. 11:14

    1. 매개변수가 1차원 배열인 경우

     1차원 배열이 int 형인 경우


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    /*
     * parameter.c
     *
     *  Created on: 2015. 8. 10.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    void print_temp(int *int);
     
    int main(void) {
     
        int sum;
        int tmp[] = { 1142198257 };
     
        print_temp(tmp, sizeof(tmp) / sizeof(int));
     
        return 0;
    }
     
    void print_temp(int *tmp, int length) {
        int i;
     
        for (i = 0; i < length; i++)
            printf("tmp[%d] = %d\n", i, *tmp++);
    }
     
     
    cs











     1차원 배열이 문자인 경우


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    /*
     * parameter.c
     *
     *  Created on: 2015. 8. 10.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    void print_name(char *);
     
    int main(void) {
     
        char name[] = "Yeonsu Moon";
     
        print_name(name);
     
        return 0;
    }
     
    void print_name(char *my_name) {
        for (; *my_name;)
            putchar(*my_name++);
    }
     
    cs















    2. 매개변수가 2차원 배열인 경우

     2차원 배열이 int 형인 경우



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    /*
     * parameter.c
     *
     *  Created on: 2015. 8. 10.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    void print_element(int (*)[3]);
     
    int main(void) {
     
        int tmp[][3= { { 613 }, { 524 } };
     
        print_element(tmp);
     
        return 0;
    }
     
    void print_element(int (*tmp)[3]) {
     
        int i, j;
     
        puts("첫 번째 방법");
     
        for (i = 0; i < 2; i++)
            for (j = 0; j < 3; j++)
                printf("1. [%d][%d] = %d\n", i, j, tmp[i][j]);
     
        puts("");
        puts("두 번째 방법");
     
        for (i = 0; i < 2; i++)
            for (j = 0; j < 3; j++)
                printf("2. [%d][%d] = %d\n", i, j, *(tmp[i] + j));
     
        puts("");
        puts("세 번째 방법");
        for (i = 0; i < 2; i++)
            for (j = 0; j < 3; j++)
                printf("3. [%d][%d] = %d\n", i, j, *(*(tmp + i) + j));
     
    }
     
    cs











     2차원 배열이 문자인 경우


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    /*
     * parameter.c
     *
     *  Created on: 2015. 8. 10.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
    #define ROW 7
    #define COLUMN 10
     
    void print_week(char (*)[10], int);
     
    int main(void) {
     
        char days[ROW][COLUMN] = { "Sunday""Monday""Tuesday""Wednesday",
                "Thursday""Friday""Saturday" };
     
        print_week(days, ROW);
     
        return 0;
    }
     
    void print_week(char (*days)[10], int row) {
     
        int i, j;
     
        for (i = 0; i < row; i++)
            puts(days[i]);
     
        puts("");
     
        for (i = 0; i < row; i++) {
            for (j = 0; j < COLUMN; j++)
                putchar(days[i][j]);
            puts("");
        }
     
    }
     
    cs











     문자열을 다룰 때 2차원 배열을 사용하는 경우는 거의 없다(메모리 낭비가 너무 심하기 때문이다). 


     위 프로그램은 print_week()의 본체에서 세번 째 for문은 문자열 출력을 마친 상태에서도 공회전한다는 것을 알 수 있다(문자열의 길이가 6이면 6번 회전해야 하는데 무조건 10번 회전한다). 


     이 문제는 위 구문을 아래와 같이 수정하여서 공회전을 막을 수 있다.


    1
    2
    3
    for (j = 0; days[i][j]; j++)
        putchar(days[i][j]);
     
    cs











     days[i][j]가 NULL 문자이면 문자열의 끝이므로 더 이상 회전하지 않는다.




     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    /*
     * parameter.c
     *
     *  Created on: 2015. 8. 10.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    void print_week(char **);    // 함수 선언
     
    int main(void) {
     
        char *days[] = { "Sunday""Monday""Tuesday""Wednesday""Thursday",
                "Friday""Saturday", NULL };
     
        print_week(days);        // 함수 호출
     
        return 0;
    }
     
    void print_week(char **days) {        // 함수 본체 정의
     
        int i;
     
        for (i = 0; i < 7; i++)
            puts(days[i]);
     
        puts("");
        for (; *days; days++) {
            for (; **days; (*days)++)
                putchar(**days);
            puts("");
        }
     
    }
     
    cs



     






     매크로를 사용하면 복잡하게 보이기 때문에 이번 예제는 매크로 변수를 삭제했다. 

     문자열을 포인터 배열에 저장하고 이를 활용한 것인데, 함수 선언에 * 연산자가 2개 필요하다는 것과 본체에서 받아들일 때도 2개 필요하다는 것을 알 수 있다. 

     그리고 puts()를 사용할 때는 2차원 배열이 문자인 경우와 같지만 문자 하나하나를 출력하는 것은 문자배열보다 복잡해 보일 것이다. 

     하지만 사실 이것은 하나의 기교일 뿐 2차원 배열이 문자일 경우와 같다. 그러므로 다음처럼 사용해도 무방하다.



    1
    2
    3
    4
    5
    6
    7
    for (i = 0; i < 7; i++
    {
        for (j = 0; days[i][j]; j++)
            putchar(days[i][j]);
        puts("");
    }
     
    cs






     


    댓글

Designed by Tistory.