본문 바로가기
프로그래밍/C

함수의 데이터 공유

by 길냥이 2025. 6. 11.
728x90

목차

  1. 값을 복사하여 전달하기
  2. 주소를 인수로 전달하기
  3. extern을 이용한 외부 연결
  4. 블록 내에서 전역 변수 참조

 

1. 값을 복사하여 전달하기

함수를 호출할 때, 일반적으로는 값이 복사하여 전달됩니다.

이를 값에 의한 전달 (call by value)라고 부릅니다.

이 방법은 함수를 호출할 때 변수, 상수, 수식도 전달할 수 있으며, 자주 사용했던 방법이죠.

 

간단한 예제를 통해서 알아봅시다.

#include <stdio.h>

void ten(int);  //함수 선언

int main(void)
{
	int a = 20;

	ten(a);   //main 내부의 a를 복사하여 전달합니다.
	printf("a : %d\n", a);   //a는 20 그대로 출력됩니다.

	return 0;
}

void ten(int a)   //7행과 다른 독립적인 a 선언
{
	a += 10;    //a값에 10을 더합니다.
}

결과는 

 

a : 20

입니다. 

 

사실 이 방법은 몇 번 사용했기에 여기까지만 하도록 하죠.

원한다면 전역변수를 이용해 실제로 이를 증가시킬 수도 있습니다. static를 사용하던지..

 

2. 주소를 인수로 전달하기

함수를 호출할 때 처리할 변수의 주소를 넘기는 방법도 있습니다.

이 경우 포인터 연산을 한번 더 해야 하기 때문에 불편하지만, 함수에서 변수의 값에 접근해 바꿀 수 있어요.

이러한 방법을 call by reference라고 부릅니다.

 

한번 해 보죠.

#include <stdio.h>

void ten(int*);  //함수 선언, 이때 매개변수는 포인터형입니다.

int main(void)
{
	int a = 20;

	ten(&a);   //a의 주소를 전달합니다.
	printf("a : %d\n", a);   //a는 30을 출력합니다.

	return 0;
}

void ten(int *a)   //7행과 다른 독립적인 a 선언, 다만 a는 main문의 a의 주소를 가집니다.
{
	*a += 10;    //a를 참조한 값에 10을 더합니다.
}

사실 이것도 많이 해 본 방법입니다.

여담으로 int* p = &a를 하는 것 또한 가능한데, 이러면 변수는 포인터 값을 복사받아 참조합니다. 

 

int a = 20;
int* p = &a;

ten(p);

또한 가능하다는 거죠. 다만 다른 부분은 수정하지 마세요.

 

3. extern을 이용한 외부 연결

지금까지 배운 것들은 이미 배운 것들입니다.

이제 전역 변수를 이용해 변수들을 연결(linkage) 해보도록 하겠습니다. 

지역 변수는 연결이 안되냐고요? 그건 블럭 밖으로 나가면 죽는다니까요..

 

이번에는 파일 두 개가 있어야 합니다. 이름은 마음대로 정해도 좋아요.

#include <stdio.h>

int all_files;   //전역 변수 선언(정의)
void sub(void);  //함수 선언, 이때 함수는 다른 파일에 위치합니다.

int main(void)
{
	sub();      //함수 호출, 이때 함수는 다른 파일에 존재합니다.
    //vsc의 경우, 소스 파일 내에 새 .C 파일을 추가해 컴파일하세요.
	printf("%d\n", all_files);

	return 0;
}
#include <stdio.h>

extern int all_files;   //외부에 정의된 전역 변수의 값을 받아옵니다.
                  //변수를 선언할 뿐 정의하지는 않습니다.
void sub(void)
{
	all_files = 10;
}

출력은 다음과 같습니다.

 

10

이 프로그램의 구조는 다음과 같아요.

 

4. 블록 내에서 전역 변수 참조

일반적으로 전역 변수는 블럭 내에서 같은 이름의 변수가 선언되면 그 블럭 내에서는 사용할 수 없습니다.

하지만 extern을 사용하면 블록 내에서 전역 변수에 접근할 수 있어요.

#include <stdio.h>

int value = 100;  // 전역 변수

int main(void) 
{
    int value = 50;  // 지역 변수 (전역과 이름 충돌)

    printf("지역 변수 value: %d\n", value);  // → 50 출력

    {   //내부 블럭 만들기, 새 블럭을 만들어 함수의 scope를 분리합니다.
        extern int value;  // 전역 변수로 다시 접근!
        printf("전역 변수 value: %d\n", value);  // → 100 출력
    }

    return 0;
}

출력은 다음과 같습니다.

 

지역 변수 value: 50
전역 변수 value: 100

이해를 돕기 위해 만든 변수의 scope의 값은 다음과 같아요.

 

 

728x90

'프로그래밍 > C' 카테고리의 다른 글

다차원 배열  (0) 2025.06.11
배열 - 예제 모음  (0) 2025.06.11
변수 저장 유형  (1) 2025.06.11
변수 사용 영역  (0) 2025.06.10
버퍼를 사용하는 입력 함수  (0) 2025.06.09