C 언어 기초

void f(int x) { x = 10; }
void g(int *p) { *p = 20; }
int main(void) {
    int a = 1, b = 1;
    f(a);
    g(&b);
    printf("%d %d\n", a, b);
    return 0;
}

위의 프로그램을 실행했을 때의 출력으로 올바른 것은?

  1. A1 20
  2. B10 1
  3. C10 20
정답과 해설 보기

정답: A. 1 20

C 언어의 함수 인수는 값 전달(call by value)이므로, f(a)를 호출하면 a의 값 1이 x에 복사됩니다. f 안에서 x를 10으로 해도 바뀌는 것은 복사본뿐이며, 호출한 쪽의 a는 1 그대로입니다. g(&b)에서는 b의 주소를 전달하고 있으므로, g 안의 *p = 20은 b 자체에 쓰며 b는 20이 됩니다. 호출한 함수 안에서 호출한 쪽의 변수를 바꾸고 싶을 때는 이처럼 포인터를 전달합니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. 위의 함수 f를 3번 연속으로 호출했을 때, 세 번째 반환값으로 올바른 것은?
  2. C 언어에서 (1) 함수 안에서 static을 붙이지 않고 선언한 지역 변수, (2) malloc으로 확보한 영역, (3) 함수 밖에서 선언한 변수가 각각 존재하는 기간(수명)의 조합으로 올바른 것은?
  3. int는 32비트(최댓값 2147483647)로 한다. 위의 함수 fact(n)이 n의 계승을 오버플로 없이 올바르게 반환하는 최대의 n은?
  4. int는 4바이트, 포인터는 8바이트로 한다. int형에 대한 포인터 p의 값(주소)이 0x1000일 때, p + 3의 값은?
  5. int는 4바이트, 포인터는 8바이트로 한다. 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?