웹사이트 검색

Linux C 프로그래밍 자습서 8부 - 값에 의한 호출 대 포인터/주소에 의한 호출


진행 중인 이 가이드 시리즈의 첫 번째 부분에서는 선언 및 본문을 포함한 함수에 대해 간략하게 논의했습니다. 그때 우리가 논의하지 않은 것은 함수가 호출되는 다양한 방법이었습니다. 여기, 이 튜토리얼에서는 존재하는 방법에 대해 빠르게 논의할 것입니다. div-gpt-ad-howtoforge_com-box-3-0;var ffid=1;var alS=1002%1000;var container=document.getElementById(slotId);container.style.width=100%;var ins=document. createElement(ins);ins.id=slotId+-asloaded;ins.className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ins.dataset.fullWidthResponsive= 진실;}

C 언어에서는 값에 의한 호출과 포인터 또는 주소에 의한 호출의 두 가지 방법으로 함수를 호출할 수 있습니다. 이해하기 쉬운 몇 가지 예를 통해 이 두 가지 개념에 대해 논의해 보겠습니다.

두 값을 교환하는 프로그램을 작성하고 싶다고 가정해 보겠습니다. 방법은 다음과 같습니다.

#include <stdio.h>

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

c = a;
a = b;
b = c;

printf("\nSwapped values are: %d and %d", a,b);



return 0;
}

입력된 값이 5와 9인 이 코드의 출력은 다음과 같습니다.

Enter two integer values
5 9

Entered values are: 5 and 9
Swapped values are: 9 and 5

이제 모든 교환 관련 작업을 수행하고 프로그래머가 두 값을 교환하려고 할 때마다 호출할 수 있는 별도의 함수(예: swap)가 필요하다고 가정합니다. 다음은 이를 수행하는 코드입니다.

#include <stdio.h>

void swap (int val1, int val2)
{
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

그래서 당신은 간다. 두 개의 값(원래 사용자가 입력하고 기본 함수에서 캡처됨)을 인수로 받은 다음 이를 교환하고 출력을 인쇄하는 swap이라는 별도의 함수가 생성되었습니다.

여기서 스왑이 호출되는 방식을 값에 의한 호출이라고 합니다. 그 이유는 호출이 이루어질 때 a와 b가 보유한 값만 스왑 함수에 인수로 전달되기 때문입니다. 이러한 값은 val1 및 val2 인수와 스왑 프로세스가 수행되는 변수에 의해 수신됩니다.

즉, main 함수의 변수 a와 b는 스왑 작업이 수행된 후에도 원래 값을 계속 유지합니다. 그러나 교환 함수를 호출한 후 a와 b의 값을 교환해야 하는 경우에는 어떻게 해야 합니까? 글쎄, 이것은 포인터/주소 방법에 의한 호출이 그림에 나오는 곳입니다.

따라서 기본적으로 여기서 우리가 하는 일은 변수의 주소(우리의 경우 a 및 b와 같은)를 인수로 전달하는 것입니다. 호출된 함수(이 경우 스왑)는 주소를 인수로 수신한 다음 이 주소에 보관된 값에 대해 스왑 프로세스가 수행됩니다. 즉, 원래 변수(여기서는 a 및 b)의 값이 스왑됩니다.

자, 이전 단락에서 우리는 함수가 \주소를 인수로 받을 수 있도록 장착되어 있다\고 말했습니다. 글쎄, "장비되어 있다\는 것은 주소를 받을 수 있는 특별한 유형의 인수가 있다는 것을 의미했습니다. 이러한 인수는 포인터 유형 변수입니다. 다음 튜토리얼에서 포인터에 대해 자세히 논의하겠지만 지금은 포인터 변수가 메모리 주소를 값으로 저장한다는 점을 명심하십시오.

정수에 대한 포인터가 선언/정의되는 방법은 다음과 같습니다.

int *x;

따라서 기본적으로 x는 정수 변수의 메모리 주소를 저장하는 데 사용할 수 있는 포인터 변수입니다. i가 정수 변수라고 가정하면 x가 i의 주소를 저장하도록 하는 방법은 다음과 같습니다.

x = &i;

그리고 i에서 x까지의 값에 액세스하고 싶을 때마다 *x를 씁니다. 예를 들어 i의 값을 예를 들어 10으로 변경하는 방법은 다음과 같습니다.

*x = 10;

따라서 이 모든 것을 염두에 두고 주소 또는 포인터 방법에 의한 호출을 사용하여 스왑을 호출하는 방법은 다음과 같습니다.

#include <stdio.h>

void swap (int *val1, int *val2)
{
int temp = 0;

temp = *val1;
*val1 = *val2;
*val2 = temp;

}

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(&a,&b);

printf("\nSwapped values are: %d and %d", a,b);


return 0;
}

그래서 이번에는 a와 b의 값을 인수로 전달하는 대신 이 변수들의 주소를 전달했습니다. 스왑 기능에서 주소는 두 개의 포인터 변수(val1 및 val2)로 수신됩니다. 그리고 두 개의 포인터 변수를 사용하여 논리는 a와 b의 값을 직접 교환합니다.

결과는 다음과 같습니다.

Enter two integer values 
6 8
Entered values are: 6 and 8
Swapped values are: 8 and 6

이 기사에서는 값에 의한 호출과 주소/포인터에 의한 함수 호출 방식이 무엇이며 언제 사용할 수 있는지에 대한 최소한의 기본 아이디어를 제공해야 합니다. 여기에 나열된 예제를 시도하고 의심이나 질문이 있는 경우 아래 의견에 알려주십시오.