[WEEK 05] C - 함수

신호정 벨로그·2021년 9월 4일
0

Today I Learned

목록 보기
18/89

포인터를 이용한 함수

/* 두 변수의 값을 교환하는 (잘못된) 함수 */

#include <stdio.h>

int swap(int a, int b) {
    int temp = a;

    a = b;
    b = temp;

    return 0;
}

int main() {
    int i, j;

    i = 3;
    j = 5;

    printf("함수 호출 이전: i: %d, j: %d \n", i, j);
    swap(i, j);
    printf("함수 호출 이후: i: %d, j: %d \n", i, j);

    return 0;
}

함수 호출 이전: i: 3, j: 5
함수 호출 이후: i: 3, j: 5

swap() 함수의 변수 a, b가 내부에서 선언된 변수들이기 때문에 결과가 바뀌지 않는다.

/* 올바른 변수 교환 함수 */

#include <stdio.h>

int swap(int *a, int *b) {
    int temp = *a;

    *a = *b;
    *b = temp;

    return 0;
}

int main() {
    int i, j;

    i = 3;
    j = 5;

    printf("함수 호출 이전: i: %d, j: %d \n", i, j);

    swap(&i, &j);

    printf("함수 호출 이후: i: %d, j: %d \n", i, j);
    
    return 0;
}

어떠한 함수가 특정한 타입의 변수/배열의 값을 바꾸려면 함수의 인자는 반드시 그 타입을 가리키는 포인터를 이용해야 한다.

위의 함수에서는 a와 b에 i와 j의 주소값을 전달하여 a와 b로 하여금 i와 j를 가리키도록 하였다.
따라서 변수 i와 j를 바꾸는 것이 아니라 i와 j의 주소값을 바꿔야 변수에 저장된 값이 바뀐다.

함수의 원형

/* 함수의 원형 */

#include <stdio.h>

// 함수의 원형
int swap(int *a, int *b);

int main() {
    int i, j;
    i = 3;
    j = 5;

    printf("함수 호출 이전: i: %d, j: %d \n", i, j);

    swap(&i, &j);

    printf("함수 호출 이후: i: %d, j: %d \n", i, j);

    return 0;
}

int swap(int *a, int *b) {
    int temp = *a;

    *a = *b;
    *b = temp;

    return 0;
}

함수의 원형을 통해 어떤 함수를 이용할 것인지 전달한다.

배열을 인자로 받기

/* 배열을 인자로 받기 */

# include <stdio.h>

int add_number(int *parr);

int main() {
    int arr[3];
    int i;

    // 사용자로부터 3개의 원소를 입력 받는다.
    for (i = 0; i < 3; i++) {
        scanf("%d", &arr[i]);
    }

    add_number(arr);

    printf("배열의 각 원소: %d, %d, %d", arr[0], arr[1], arr[2]);

    return 0;
}

int add_number(int *parr) {
    int i;

    for (i = 0; i < 3; i++){
        parr[i]++;
    }

    return 0;
}

0개의 댓글