Minwoo Dev.

<윤성우의 열혈 C프로그래밍> :: 14. 포인터와 함수에 대한 이해 문제풀이 본문

C++

<윤성우의 열혈 C프로그래밍> :: 14. 포인터와 함수에 대한 이해 문제풀이

itisminu 2023. 9. 4. 23:01
728x90
반응형
SMALL

문제 14-1

 

 

문제 1

변수 num 에 저장된 값을 제곱을 계산하는 함수를 정의하고, 이를 호출하는 main 함수를 작성해보자. 단, 여기서는 다음 두 가지 형태로 함수를 정의해야 한다.

  • Call-by-value 기반의 SqareByValue 함수
  • Call-by-reference 기반의 SqareByReference 함수
#include<stdio.h>

void SquareByValue(int n)
{
    n*=n;
    printf("In SquareByValue : %d\n",n);
}

void SquareByReference(int *m)
{
    *m = (*m)*(*m);
}

int main(void)
{
    int n=0;
    scanf("%d",&n);

    SquareByValue(n);
    printf("Main_SquarByValue : %d\n",n);

    SquareByReference(&n);
    printf("Main_SqareByReference : %d\n",n);

    return 0;
}

 

 

문제 2

세 변수에 저장된 값을 서로 뒤바꾸는 함수를 정의해보자. 예를 들어서 함수의 이름이 Swap3라 하면, 다음의 형태로 함수가 호출되어야 한다.

Swap3(&num1,&num2,&num3);

 

#include<stdio.h>

void Swap3(int *num1, int *num2, int *num3)
{
    int temp = *num1;
    *num1 = *num3;
    *num3 = *num2;
    *num2 = temp;
}

int main(void)
{
    int num1 = 0, num2 = 0, num3 = 0;
    scanf("%d %d %d",&num1,&num2,&num3);

    printf("Before Swap\nnum1 : %d\nnum2 : %d\nnum3 : %d\n\n",num1,num2,num3);

    Swap3(&num1,&num2,&num3);
    printf("After Swap\nnum1 : %d\nnum2 : %d\nnum3 : %d\n",num1,num2,num3);

    return 0;
}

 

 

 

문제 14-2

 

문제 1

아래에 정의된 함수를 보자. 인자로 전달되는 정보를 참조하여 int형 배열요소 전체를 출력하는 함수이다.

#include<stdio.h>

void ShowAllData(const int * arr, int len)
{
    int i;
    for(i=0;i<len;i++)
        printf("%d ",arr[i]);
}

위 함수의 매개변수 선언에서 매개변수 arr을 대상으로 const 선언을 한 이유가 무엇이겠는가 ? 이 함수를 정의한 사람의 의도를 이야기해 보자.

 

A : 제시된 함수는 전달된 배열의 모든 요소를 출력하는 함수이다. 프로그래머가 실수로 배열의 값을 바꾸게 되면 안되므로, 데이터 값 보호를 위해 const 선언을 한 거 같다.

 

문제 2

아래의 예제는 한 가지 지적할만한 사항을 지니고 있다. 그것이 무엇인지 이야기해보자. 특히 이와 관련해서 ShowData 함수를 유심히 관찰하기 바란다. 

#include<stdio.h>

void ShowData(const int * ptr)
{
    int * rptr = ptr;
    printf("%d \n",*rptr);
    *rptr = 20;
}

int main(void)
{
    int num = 10;
    int * ptr = &num;
    ShowData(ptr);
    return 0;
}

 

A : 매개변수 ptr에 const 선언이 추가되었다. 이는 함수 ShowData 내에서 ptr을 통해 ptr이 가리키는 변수에 저장된 값을 변경시키지 않겠다는 의도가 포함된 선언이다. 그런데 다음 행에서 다음과 같이 ptr에 저장된 값을 const로 선언되지 않은 포인터 변수에 대입하고 있다.

int * rptr = ptr;

결과적으로 rptr을 사용해서 ptr이 가리키는 변수에 저장된 값을 변경할 수 있는 상황이 되어버렸다. 따라서 ptr에 const 선언을 추가한 것이 의미없는 상황이 되어버렸다. 이렇듯 const 선언을 무의미하게 만드는 문장을 삽입하는 것은 잘못된 일이다.

728x90
반응형
LIST