본문 바로가기
C Programming/연습 문제

[C언어 연습문제]강좌 4. Pointers in C(포인터로 2개의 변수를 반환하는 함수 구현)

by 희품 2019. 2. 16.
반응형


학습(Study)

여기서는 C언어의 포인터의 기본적인 사용 방법을 구현하는 방법을 배울 수 있습니다. C언어에서 포인터는 주로 함수에서 여러 데이터 간의 메모리 주소를 공유하는 방법으로 많이 쓰입니다. 함수가 소유권이 없는 변수 내용을 수정해야 할 때마다 주로 사용됩니다.


변수의 메모리 주소에 접근하려면 & 기호를 붙여서 사용해야 합니다. 예를 들어 val 변수의 주소에 접근하려면 &val을 사용해서 val 변수의 주솟값을 반환받을 수 있습니다.


이 메모리 주소가 포인터에 할당되어, 다양한 함수에서 공유할 수 있습니다.


int *p = &val; 을 예를 들면, val 변수의 메모리 주소가 p 포인터에 할당된다고 보면 됩니다. 변수명 앞에 * 기호를 사용하면, 포인터의 메모리 내용에 접근하여 값을 읽을 수 있습니다.


int *p = &val; 에서 *p를 사용하면, val 변수의 값을 읽을 수 있습니다.

void increment(int *v)
{
    (*v)++
}
 
int main()
{
    int a;
    scanf("%d"&a);
    increment(&a);
    printf("%d", a);
    
    return 0;      
}


위에는 increment 함수를 사용할 때, int 변수 a의 주소 값을 넘겨서, 값을 증가시킨 후 반환하는 함수 예제입니다.


추가 이론

C언어의 포인터를 이론으로 얘기할 때 필요한 건 call-by-value와 call-by-reference이죠. 임의의 변수의 주소를 함수의 인자로 넘겨 변수를 수정하는 것을 참조를 넘겨 수정한다고 해서 call-by-reference라고 부르죠.


목표(Objective)

2개의 정수 포인터 인자값을 받는 함수에서 그 두 수의 합을 세팅하고, 다른 하나는 다른 두 수의 차이를 반환하는 함수를 구현해보자.


과제(Task)

함수 void update(int *a, int *b)를 구현하자.

인자로 전달받은 a에는 a의 값과 b의 값의 합을 입력받아 다시 반환하고,

인자로 전달받은 b에는 b의 인자 값과 a와 b의 차이를 입력받아 다시 반환하는 기능을 구현한다.


입력 형식(Input Format)

새로운 줄로 구분하는 2개의 정수 인자 a와 b를 입력받는다.


제약 조건(Constraints)

딱히 없음


출력 형식(Output Format)

반환한 변수 a와 b를 2줄로 출력한다.


입력 예제(Sample Input)

4

5


출력 예제(Sample Output)

9

1


기본 코드


#include <stdio.h>
 
void update(int *a,int *b){
    // Complete this function    
}
 
int main() {
    int a, b;
    int *pa = &a, *pb = &b;
    
    scanf("%d %d"&a, &b);
    update(pa, pb);
    printf("%d\n%d", a, b);
 
    return 0;
}


코드


샘플 정답
#include <cstdio>
#include <cstdlib>
 
void update(int *a,int *b) {
    int temp = *a;
    *= *+ *b;
    *= abs(temp - *b);
 
}
 
int main() {
    int a, b;
    int *pa = &a, *pb = &b;
    
    scanf("%d %d"&a, &b);
    update(pa, pb);
    printf("%d\n%d", a, b);
 
    return 0;
}

정답으로 사용한 코드
#include <stdio.h>
 
void update(int *a,int *b)
{
    int aRet = 0, bRet = 0;
 
    aRet = *+ *b;
    bRet = (*- *> 0) ? (*- *b) : (*- *a);
 
    *= aRet;
    *= bRet;
}
 
int main(void)
{
    int a = 0, b = 0;
    int *pa = &a, *pb = &b;
    
    scanf("%d %d"&a, &b);
    update(pa, pb);
    printf("%d\n%d", a, b);
 
    return 0;
}

핵심은 a+b를 a의 포인터에 바로 사용하면, a의 값이 변해 b의 값을 수정할 때 원하는 값을 얻을 수 없으므로, 임시 변수를 사용해 값을 저장할 필요가 있다는 것이죠.

저는 따로 include를 하기 번거로워서(?) 두 수의 차이를 절댓값 함수를 사용하지 않고 양수로 반환하도록 작성하였습니다. 가독성을 위해 임시 변수를 2개 작성하였고, 정답에 맞는 직관적인 해답을 사용하였어요.

포인터를 세부적으로 들어가면, 복잡해지고, 더 활용도가 높긴 하지만, 실무에서 많이 사용하는 방법을 소개해준 것 같네요.


반응형