기본 콘텐츠로 건너뛰기

방송대 C프로그래밍 7강: 값·주소 전달과 기억 클래스

0-썸네일-요약노트-C프로그래밍-7강

방송대 C프로그래밍 7강: 값·주소 전달과 기억 클래스

함수 안에서 값을 바꿨는데 호출한 쪽의 변수는 그대로일 때도 있고, 실제로 바뀔 때도 있다. 같은 이름의 변수도 블록에 따라 전혀 다른 대상을 가리키며, 어떤 변수는 함수가 끝나도 값을 기억한다. 이 글은 이 현상을 값의 이동, 이름을 찾는 범위, 객체가 살아 있는 시간이라는 세 지도로 연결한다.

변수를 이해하려면 값·이름·시간의 지도를 나누어 본다

함수와 변수를 공부할 때 가장 자주 생기는 혼동은 서로 다른 질문을 한꺼번에 답하려는 데서 시작한다. “함수에 무엇이 전달되는가”, “이 이름을 어디에서 사용할 수 있는가”, “그 저장공간은 언제까지 유지되는가”는 각각 다른 규칙이다.

지도핵심 질문확인할 개념대표 실수
자료 전달 지도함수 호출 때 무엇이 복사되는가?실 매개변수, 형식 매개변수, 값, 주소, 반환값복사본을 바꾸고 원본도 바뀌었다고 생각함
이름 지도현재 위치에서 같은 이름은 어느 선언을 가리키는가?지역변수, 전역변수, 블록, 이름 가림가장 안쪽 선언을 건너뛰고 전역변수를 읽음
시간 지도저장공간은 언제 생기고 언제 사라지는가?자동, 정적, 외부, 레지스터 변수의 존속기간유효범위와 존속기간을 같은 뜻으로 봄

예를 들어 블록 안의 static 변수는 그 블록에서만 이름을 쓸 수 있지만 프로그램이 끝날 때까지 저장공간은 유지된다. 반대로 일반 지역변수는 이름을 쓸 수 있는 범위도 블록 안이고, 그 블록을 실행할 때마다 저장공간이 새로 생겼다가 사라진다. 이름 지도와 시간 지도를 분리해야 이 차이가 보인다.

판단 핵심: 코드를 읽을 때는 먼저 전달된 것이 값인지 주소값인지 표시하고, 현재 위치에서 보이는 선언을 찾은 뒤, 그 객체가 이전 호출의 값을 유지하는지 확인한다.

함수 호출은 인수를 형식 매개변수에 연결하고 결과를 복귀시킨다

함수 호출식에 적는 값이나 변수는 실 매개변수(actual parameter), 즉 인수(argument)다. 피호출 함수의 머리에서 자료를 받을 목적으로 선언한 변수는 형식 매개변수(formal parameter)다. 호출이 시작되면 각 인수의 값이 대응하는 형식 매개변수로 전달되고, return이 실행되면 결과값이 호출식의 값으로 돌아온다.

다음은 강의의 덧셈 흐름을 다른 수치로 재구성한 예다.

#include <stdio.h>

int add(int x, int y) {
    int result = x + y;
    return result;
}

int main(void) {
    int left = 14;
    int right = 9;
    int total = add(left, right);

    printf("%d\n", total);
    return 0;
}
  1. add(left, right)를 호출하는 순간 인수의 현재 값 14와 9가 준비된다.
  2. 함수 안의 새 변수 x와 y가 각각 14와 9를 받는다.
  3. result에 23을 저장하고 return result;가 23을 호출식으로 돌려준다.
  4. 호출식의 값 23이 main의 total에 저장된다.

left와 x의 값은 처음에 같지만 서로 다른 변수다. 호출 전에 존재하던 원본과 호출 중 만들어진 매개변수의 저장공간을 구분하는 것이 값 전달의 출발점이다.

값을 복사하면 원본이 보존되고 주소를 복사하면 원본에 닿는다

C의 함수 인수는 기본적으로 값으로 전달된다. 일반 변수를 인수로 쓰면 그 변수에 들어 있던 값이 복사된다. 포인터를 인수로 써도 전달되는 것은 포인터에 들어 있는 주소값의 복사본이다. 다만 그 주소를 역참조하면 호출자 변수의 저장공간에 접근할 수 있으므로, 강의에서는 이를 포인터를 이용한 참조에 의한 자료 전달로 설명한다.

호출 형태형식 매개변수복사되는 것함수에서 원본 변경선택 기준
swap_value(a, b)int x, int y정수값 두 개불가능입력값을 읽고 계산만 할 때
swap_address(&a, &b)int *x, int *y주소값 두 개*x, *y를 통해 가능호출자의 여러 값을 바꿔 결과로 돌려줄 때

두 방식의 차이는 교환 함수에서 선명하게 드러난다. 먼저 값만 받은 함수다.

void swap_value(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
}

int a = 7;
int b = 12;
swap_value(a, b);

함수 안에서는 x와 y가 12와 7로 바뀌지만, 복귀 뒤 a와 b는 여전히 7과 12다. 복사본 두 개만 교환했기 때문이다. 다음은 주소를 받은 함수다.

void swap_address(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int a = 7;
int b = 12;
swap_address(&a, &b);

&a와 &b는 두 변수의 주소를 구한다. 함수 안의 *x와 *y는 그 주소가 가리키는 실제 정수에 접근하므로 복귀 뒤 a는 12, b는 7이다. 포인터 변수 x 자체는 복사본이지만, 그 안의 주소값이 원본의 위치를 알려 주는 것이다.

오개념 교정: “C가 포인터를 참조 자체로 전달한다”라고 외우면 포인터도 값으로 복사된다는 사실을 놓친다. 정확한 추적은 주소값 복사 - 역참조 - 원본 저장공간 수정의 세 단계다.

결과 통로의 수를 세면 반환값과 포인터의 역할이 구분된다

함수의 계산 결과가 하나라면 반환값이 가장 직접적인 통로다. 그러나 몫과 나머지처럼 결과가 둘 이상이거나, 호출자가 가진 값을 함수 안에서 직접 수정해야 한다면 포인터 매개변수가 유용하다. 큰 자료를 전달할 때도 전체 내용을 복사하는 대신 주소값을 전달하는 방식이 활용될 수 있다.

다음 학습용 함수는 정수 나눗셈의 몫을 반환하고 나머지는 포인터를 통해 기록한다.

int divide_with_remainder(int value, int divisor, int *remainder) {
    *remainder = value % divisor;
    return value / divisor;
}

int rest;
int quotient = divide_with_remainder(29, 6, &rest);

호출 과정을 통로별로 나누면 다음과 같다.

  1. value와 divisor에는 29와 6이 값으로 복사된다.
  2. remainder에는 호출자 변수 rest의 주소값이 복사된다.
  3. *remainder = 29 % 6;이 원본 rest에 5를 기록한다.
  4. return 29 / 6;이 몫 4를 호출식으로 돌려주고 quotient가 이를 받는다.

검산하면 6 * 4 + 5 = 29다. 포인터를 사용할 때는 호출자가 유효한 변수의 주소를 전달했는지, 함수가 그 주소에 어떤 값을 기록하는지까지 계약처럼 확인해야 한다.

선택 기준: 입력만 필요하면 값 매개변수, 호출자 상태를 바꿔야 하면 포인터 매개변수, 대표 결과 하나를 돌려주면 반환값을 우선 검토한다.

이름은 현재 블록에서 시작해 바깥쪽 선언을 찾는다

유효범위(scope)는 변수나 함수 같은 명칭을 사용할 수 있는 소스 코드의 영역이다. 블록이나 함수 안에 선언한 지역변수와 형식 매개변수는 그 선언이 속한 범위에서 사용할 수 있다. 함수 밖에 정의한 전역변수는 파일 범위에서 이름을 사용할 수 있고, 필요한 연결 선언을 통해 다른 파일에서도 같은 외부 객체를 사용할 수 있다.

같은 이름의 선언이 여러 겹이면 가장 안쪽 블록의 선언이 바깥 선언을 가린다. 다음 직접 구성한 예에서 이름 level이 가리키는 대상을 위치별로 찾아보자.

int level = 5;

int main(void) {
    int level = 8;
    printf("%d\n", level);

    {
        int level = 13;
        printf("%d\n", level);
    }

    printf("%d\n", level);
    return 0;
}

첫 출력은 main의 지역변수 8이다. 안쪽 블록에서는 새 지역변수 13이 이를 가리므로 두 번째 출력은 13이다. 블록을 벗어나면 안쪽 선언의 유효범위가 끝나 세 번째 출력은 다시 8이다. 전역변수 5는 이 두 지역변수에 가려져 세 출력에서 선택되지 않는다.

이름을 찾는 실전 규칙은 간단하다. 현재 위치를 둘러싼 가장 작은 블록에서 해당 선언을 찾고, 없으면 한 단계 바깥으로 이동한다. 첫 번째로 만난 선언이 그 이름의 대상이다.

왜 지역변수를 우선하는가: 필요한 상태를 함수 안에 제한하면 다른 함수가 뜻밖에 값을 바꾸는 경로가 줄어 함수의 독립성과 디버깅 가능성이 높아진다. 전역 상태가 필요한 경우에도 사용 범위와 변경 책임을 명확히 해야 한다.

유효범위와 존속기간은 공간과 시간이라는 서로 다른 축이다

기억 클래스(storage class)는 변수의 유효범위, 존속기간(lifetime), 연결 방식과 저장에 관한 성격을 정한다. 유효범위는 “이 이름을 어디에서 쓸 수 있는가”를 묻고, 존속기간은 “그 객체의 저장공간이 언제부터 언제까지 존재하는가”를 묻는다.

구분주 선언 위치이름을 쓰는 범위저장공간이 유지되는 기간초기화 생략 시
auto함수 또는 블록 내부소속 함수·블록블록에 진입할 때부터 빠져나갈 때까지미정값이므로 읽기 전에 초기화 필요
블록 내부 static함수 또는 블록 내부소속 함수·블록프로그램 시작부터 종료까지0으로 초기화
파일 범위 static함수 밖그 소스 파일 안프로그램 시작부터 종료까지0으로 초기화
extern이 가리키는 외부 객체함수 밖 정의, 필요한 곳에서 선언선언이 보이는 영역과 연결된 파일프로그램 시작부터 종료까지정의에서 초기화를 생략하면 0
register함수 또는 블록 내부소속 함수·블록자동변수와 동일미정값이므로 초기화 필요

가장 중요한 경계 사례는 블록 내부의 static이다. 이름은 블록 밖에서 보이지 않지만 값은 다음 호출까지 살아 있다. 따라서 “지역변수면 함수가 끝날 때 모두 사라진다”는 문장은 자동 지역변수에는 맞지만 정적 지역변수에는 맞지 않는다.

auto와 static의 차이는 함수를 다시 호출할 때 드러난다

지역변수의 기본 기억 클래스는 auto이므로 보통 예약어를 생략한다. 자동변수는 블록에 들어갈 때마다 새로 생성되고, 블록을 벗어나면 제거된다. 명시적으로 초기화하지 않은 자동변수에는 미정값이 있으므로 그 값을 읽기 전에 반드시 유효한 값을 저장해야 한다.

static 지역변수는 이름의 유효범위는 지역에 머물지만 저장공간이 프로그램 실행 내내 유지된다. 다음 학습용 함수를 세 번 호출해 두 변수를 비교해 보자.

#include <stdio.h>

void visit(void) {
    int current = 0;
    static int accumulated = 0;

    current++;
    accumulated++;
    printf("current=%d, accumulated=%d\n", current, accumulated);
}

int main(void) {
    visit();
    visit();
    visit();
    return 0;
}

세 호출의 출력은 차례로 current=1, accumulated=1, current=1, accumulated=2, current=1, accumulated=3이다. current는 호출마다 새로 만들어져 0부터 시작하지만, accumulated는 이전 호출의 값을 이어받는다.

정적 변수도 초기화 식이 매번 실행되는 것으로 생각하면 출력값을 1, 1, 1로 잘못 예측한다. 선언문이 함수 안에 있다는 사실은 이름의 범위를 말할 뿐이고, static은 저장공간의 시간을 프로그램 전체로 늘린다.

extern은 파일 사이 정의를 연결하고 register는 저장 위치를 요청한다

extern은 다른 곳의 정의를 새 이름으로 만드는 것이 아니다

외부변수는 함수 밖에 정의된 전역 객체다. 다른 소스 파일에서 그 객체를 사용하려면 extern 선언으로 “이 이름의 정의가 다른 곳에 있다”는 사실을 컴파일러에 알린다. 선언은 기존 객체를 가리키며 같은 저장공간을 새로 하나 더 만드는 목적이 아니다.

다음 두 파일은 하나의 변수 shared_count를 공유하는 최소 예다.

/* counter.c */
int shared_count = 0;

void increase(void) {
    shared_count++;
}
/* main.c */
#include <stdio.h>

extern int shared_count;
void increase(void);

int main(void) {
    increase();
    printf("%d\n", shared_count);
    return 0;
}

counter.c의 문장은 저장공간을 갖는 정의이고, main.c의 extern 문장은 그 정의를 사용하기 위한 선언이다. 두 파일을 함께 번역하고 연결하면 출력은 1이다. 반면 파일 범위에서 static으로 정의한 객체는 그 소스 파일 안에서만 이름을 연결한다.

register는 명령이 아니라 요청이다

register는 반복 횟수처럼 자주 쓰는 자동변수를 CPU 레지스터에 두어 달라고 요청하는 기억 클래스다. 유효범위, 존속기간, 초기값 규칙은 자동변수와 같다. 중요한 점은 프로그램의 계산 결과를 바꾸는 기능이 아니라 저장 최적화 의도를 나타낸다는 것이다.

int sum_to_ten(void) {
    register int i;
    int sum = 0;

    for (i = 0; i <= 10; i++) {
        sum += i;
    }
    return sum;
}

반환값은 0 + 1 + ... + 10 = 55다. register를 지워도 계산 의미는 같아야 하며, 반복 변수 i의 생성과 제거는 일반 자동변수와 같은 시점에 일어난다.

함수와 변수를 설계할 때 다섯 갈래로 결정한다

새 코드를 작성하거나 시험의 변수를 분류할 때 다음 질문을 순서대로 적용한다.

  1. 함수는 입력을 읽기만 하는가? 그렇다면 우선 값 매개변수를 사용한다.
  2. 호출자의 저장공간을 바꾸어야 하는가? 그렇다면 주소를 받고 역참조하는 포인터 매개변수를 검토한다.
  3. 이름이 필요한 최소 범위는 어디인가? 가능한 한 가장 작은 블록의 지역변수로 제한한다.
  4. 다음 호출에도 값이 남아야 하는가? 이름은 지역에 두되 상태를 유지해야 한다면 정적 지역변수를 검토한다.
  5. 여러 파일이 같은 객체를 공유해야 하는가? 한 곳에서 정의하고 다른 곳에서는 extern으로 선언한다.

마지막으로 각 변수 옆에 복사되는 값, 보이는 범위, 살아 있는 기간, 초기화 상태를 적어 본다. 이 네 항목을 채우면 값 전달, 이름 가림, 정적 상태 유지와 외부 연결을 하나의 규칙으로 설명할 수 있다.

자가 점검: 포인터 매개변수라면 주소값 자체와 그 주소가 가리키는 원본을 구분하고, 지역변수라면 자동인지 정적인지까지 확인한다. “지역”은 유효범위의 분류이고 “자동·정적”은 시간 성격까지 포함하는 분류다.

핵심 개념 정리

  • 자료 전달: 일반 값과 주소값 모두 형식 매개변수로 복사되지만, 복사된 주소를 역참조하면 호출자의 원본에 접근할 수 있다.
  • 결과 회수: 대표 결과 하나는 반환값, 호출자 상태 수정이나 여러 출력은 포인터 매개변수라는 기준으로 통로를 선택한다.
  • 이름 탐색: 현재 위치의 가장 안쪽 블록에서 시작해 바깥쪽으로 선언을 찾으며, 먼저 만난 같은 이름이 바깥 선언을 가린다.
  • 시간 구분: 자동변수는 블록 진입과 이탈에 맞춰 생성·제거되고, 정적·외부 객체는 프로그램 실행 동안 유지된다.
  • 파일 연결: 외부 객체는 한 곳에서 정의하고 필요한 파일에서 extern으로 선언하며, 파일 범위 static은 연결 범위를 해당 파일로 제한한다.

함수 호출을 만나면 인수의 현재 값 - 형식 매개변수의 복사본 - 역참조가 닿는 원본 - 반환 통로를 그린다. 변수를 만나면 가장 안쪽 선언 - 유효범위 - 존속기간 - 초기화 상태를 적는다. 이 두 지도를 겹치면 함수 안의 변경이 어디에 남는지와 다음 호출에서 어떤 값으로 시작하는지를 일관되게 예측할 수 있다. 다음 차시의 배열과 포인터에서도 주소를 통해 원본 저장공간에 접근한다는 흐름이 그대로 이어진다.

예상문제 10선

1. 함수 호출에서 실 매개변수와 형식 매개변수의 관계를 올바르게 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 값 전달에서는 원본 변수와 형식 매개변수가 별도 저장공간을 가지므로 같은 공간의 별칭이 아니다.
  • ② 오답: 위치를 거꾸로 설명했다. 실 매개변수는 호출식, 형식 매개변수는 함수 정의의 머리에 나타난다.
  • ③ 오답: 실 매개변수는 호출할 때 입력 자료를 제공하며 반환값을 받는 전용 변수가 아니다.
  • ④ 정답: 호출 시 인수의 값이 대응 순서와 자료형에 따라 형식 매개변수로 전달되어 함수 계산에 사용된다.

2. int a=7, b=12;에서 복사본만 교환하는 swap_value(a, b)를 호출한 뒤 a와 b는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 함수 안의 x와 y는 교환되지만 호출자의 원본 두 변수에는 기록하지 않는다.
  • ② 정답: 7과 12의 복사본만 함수에서 변경되므로 복귀 후 원본 a와 b는 그대로다.
  • ③ 오답: 어느 원본에도 값을 다시 대입하지 않았으므로 두 변수가 첫 값 7로 같아지지 않는다.
  • ④ 오답: 복사본의 변경을 두 원본에 동시에 반영한 것으로, 값 전달의 저장공간 분리를 놓쳤다.

3. swap_address(&a, &b)가 호출자의 두 값을 바꾸는 과정을 올바른 순서로 나열한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 일반 값 매개변수의 복사본을 바꾸어도 원본이 자동으로 갱신되지 않는다.
  • ② 오답: 주소 전달은 원본을 삭제하거나 새 원본을 만드는 과정이 아니다.
  • ③ 정답: 호출자가 구한 주소값이 포인터 매개변수에 복사되고, 역참조를 통해 그 주소의 실제 변수에 값을 쓴다.
  • ④ 오답: 형식 매개변수 선언은 호출 전에 함수 정의에 존재하며, 주소를 전달받은 다음에 역참조할 수 있다.

4. 전역 level=5, 함수 지역 level=8, 그 안쪽 블록 지역 level=13이 있을 때 안쪽 블록과 블록을 나온 직후의 출력은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 현재 위치에서 가장 안쪽 선언이 우선하므로 블록 안은 13이고, 블록을 벗어나면 함수 지역 선언 8이 다시 보인다.
  • ② 오답: 안쪽 블록의 선언을 건너뛰었고, 블록 밖에서도 함수 지역변수가 전역변수를 가린다는 점을 놓쳤다.
  • ③ 오답: 이름 탐색을 가장 바깥에서 시작했으며, 범위를 벗어난 안쪽 변수 13은 이후 사용할 수 없다.
  • ④ 오답: 첫 출력은 맞지만 함수 지역변수 8이 여전히 유효하므로 바로 전역변수 5를 선택하지 않는다.

5. 같은 함수를 세 번 호출하고 함수 안에서 int a=0;과 static int s=0;을 각각 출력한 뒤 증가시켰다. 출력 순서로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 자동변수 a는 호출마다 새로 생성되고 0으로 명시 초기화되므로 이전 증가값을 유지하지 않는다.
  • ② 오답: 정적변수 s는 프로그램 실행 동안 유지되므로 각 호출 뒤의 증가 결과가 다음 호출에 남는다.
  • ③ 오답: 자동과 정적 변수의 존속기간을 서로 반대로 적용했다.
  • ④ 정답: a는 매번 0에서 시작하고 s는 0, 1, 2로 이전 호출의 상태를 이어 간다.

6. 블록 안에서 int count;만 선언한 뒤 곧바로 값을 출력하려는 코드의 올바른 교정은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 초기화되지 않은 자동변수의 값은 사용할 수 있는 값으로 가정하면 안 되므로 읽기 전에 명시적으로 값을 정해야 한다.
  • ② 오답: 초기화 생략 시 0이 되는 규칙은 정적 저장기간을 가진 객체에 해당하며 일반 자동변수에는 적용되지 않는다.
  • ③ 오답: 변수 이름은 기억 클래스나 초기값을 결정하지 않으며 호출 간 상태 유지에는 static 같은 별도 성격이 필요하다.
  • ④ 오답: 지역·전역이라는 위치 차이뿐 아니라 자동·정적이라는 저장기간과 초기화 규칙을 함께 확인해야 한다.

7. 함수 내부에 선언한 static int total;의 성격으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 함수가 끝나면 이름을 사용할 수 없지만 정적 저장공간과 값은 다음 호출까지 유지된다.
  • ② 오답: 정적 지역변수의 유효범위는 선언된 함수나 블록 안이며 전역 이름이 아니다.
  • ③ 정답: 지역 유효범위와 프로그램 전체 존속기간이 결합되는 것이 정적 지역변수의 핵심이다.
  • ④ 오답: 정적 객체는 한 번 유지되며 초기값을 생략하면 0으로 초기화된다.

8. 다른 소스 파일에 정의된 전역변수 shared를 현재 파일에서 사용하기 위한 설명으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 새 정의를 만들면 기존 외부 객체를 선언하는 목적과 다르며 같은 객체의 공유가 아니다.
  • ② 정답: 한 파일의 정의가 저장공간을 만들고 다른 파일의 extern 선언은 그 동일한 외부 객체를 가리킨다.
  • ③ 오답: 지역 자동변수는 별도 객체이며 같은 이름의 외부변수를 가릴 뿐 연결하지 않는다.
  • ④ 오답: 외부 연결을 가진 객체는 적절한 선언과 연결 과정을 통해 여러 파일에서 사용할 수 있다.

9. register 변수와 일반 자동변수의 관계를 올바르게 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 레지스터 변수는 함수나 블록 내부에서 사용하는 지역 변수이며 전역 유효범위를 갖지 않는다.
  • ② 오답: 존속기간은 자동변수와 같아 소속 블록을 벗어나면 유지되지 않는다.
  • ③ 오답: 저장 최적화 요청은 프로그램의 산술 의미를 바꾸지 않으므로 같은 입력이면 합계도 같다.
  • ④ 정답: 자주 쓰는 값을 레지스터에 두어 달라는 의도를 나타내지만 범위와 시간 성격은 자동변수와 동일하다.

10. 함수가 정수 두 개를 입력받아 몫과 나머지를 호출자에게 모두 제공해야 한다. 강의 범위에서 가장 알맞은 설계는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 전역 상태를 만들면 함수의 변경 범위가 넓어지고 두 결과를 전달하기 위한 필수 조건도 아니다.
  • ② 정답: 읽기 전용 입력은 값으로 격리하고, 반환값과 유효한 주소를 서로 다른 결과 통로로 사용하면 두 결과가 명확히 전달된다.
  • ③ 오답: 일반 정수 형식 매개변수는 복사본이므로 그 값만 바꾸면 호출자의 결과 변수에 남지 않는다.
  • ④ 오답: register는 저장 위치 요청일 뿐 함수의 반환 통로나 매개변수 전달 방식을 늘리지 않는다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 값과 주소의 전달 흐름, 이름과 존속기간의 관계, 코드 추적과 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 C프로그래밍 7강 「함수와 기억 클래스(2)」 강의자료
  • 보충 자료: 별도의 외부 보충 자료를 사용하지 않음
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-09-07

댓글