예제 질문 "두 변수 교환"을 통해 "값에 의한 호출"과 "주소에 의한 호출"이 어떻게 진행되는지 살펴보겠습니다. (함수 매개변수와 실제 매개변수의 개념으로)

값에 의한 호출참조에 의한 호출이 어떻게 진행되는지 보기 위해 예제를 살펴보겠습니다 .
함수의 call by value를 통해 main 함수의 두 숫자를 교환할 수 없는 이유와 이 문제를 해결할 수 있는 방법에 대해 자세히 이야기하겠습니다.

조용히 말씀드리자면, 함수의 값에 의한 호출을 통해 main 함수의 두 숫자를 교환할 수 없다는 것만 알고 있었지만 여전히 작동하지 않는 이유를 모르겠습니다. 아직도 이런 의심이 든다면 작은 벤치를 세우고 앉아서 내가 당신에게 원리를 자세히 설명하는 것을 듣는 것이 좋습니다.

예: 두 변수 바꾸기

예:

"두 정수 변수의 내용을 바꾸는 함수 작성"

1. 외부 함수를 작성하여 교환하지 마십시오.

먼저 외부 함수를 작성하여 두 숫자의 값을 교환하지 않으면 다음과 같습니다.

#include<stdio.h>
int main()
{
    
    
	int a = 10;
	int b = 20;
	int c = 0;
	printf("交换前:a=%d b=%d\n", a, b);
	c = a;
	a = b;
	b = c;
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

산출

교환 전: a=10 b=20
교환 후: a=20 b=10

하지만 이제 외부 함수를 작성하여 a와 b를 바꿔야 합니다.

2. 값으로 함수를 호출하여 두 숫자를 교환해 보십시오.

위의 아이디어에 따라 다음 코드를 작성했습니다.

#include<stdio.h>
void Swap(int x, int y)
{
    
    
	int z = 0;
	z = x;
	x = y;
	y = z;
}

int main()
{
    
    
	int a = 10;
	int b = 20;
	printf("交换前:a=%d b=%d\n", a, b);
	//函数
	Swap(a, b);
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

그러나 그것을 실행
하고 작업 결과가 다음과 같은지 확인하십시오.

교환 전: a=10 b=20
교환 후: a=10 b=20

a와 b의 값은 변경되지 않았습니다.
왜 이런거야?

콜 바이 밸류의 원리

실제로
실제 매개변수 a와 b가 형식 매개변수 x와 y로 전달되면 형식 매개변수는 실제 매개변수의 임시 사본이 됩니다. 형식 매개변수
변수 x와 y를 변경해도 실제 매개변수 a와 b에는 영향을 미치지 않습니다. .
(실제 매개변수와 형식 매개변수에 대한 개념과 요약은 글 말미에 있습니다. 필요하시면 먼저 읽으셔도 됩니다.) 자세한 내용은 살펴보겠습니다. 원리는 이렇습니다. 우리는 a와 b를
만들고
, a에 10의 값이 있고 b에 20의 값을 넣은

다음 Swap 함수를 통해 매개 변수를 전달하여 변수 x와 변수 y를 만들고 x에서 a의 10, y에서 b의 20을 얻습니다.

그런 다음 변수 z를 통해 x와 y의 값을 교환합니다. 우리는 x와 y가 독립적인 메모리 공간 이며 x와 y 값의 변화가 a와 b에 전혀 영향을 미치지 않는다는

것을 알아야 합니다 . 따라서 a와 b의 값은 전혀 바뀌지 않습니다.

#그러면 위의 문제를 어떻게 해결해야 할까요?

3. 참조로 함수를 호출하여 두 숫자를 교환합니다 (양수 솔루션).

위의 예에서 공간의 관점에서 볼 때 실제 매개변수와 형식 매개변수 사이에 연결이 없으며 형식 매개변수가 위의 방식으로 실제 매개변수를 변경할 수 없음을 알 수 있습니다 . 그래서 다음으로 그것들을 연결해야 합니다.
포인터 변수 pa를 통해 a의 주소를 얻습니다.

정수 a = 10;
int* pa = &a;

a의 값을 pa로 변경

*pa = 20;//pa가 가리키는 주소의 값(즉, a에 저장된 값)을 20으로 변경

이렇게 하면 a의 주소가 pa에 저장되어 pa와 a가 연결됩니다. a의 주소는 pa를 통해 알 수 있으며, a의 값은 변경할 수 있습니다.

#include<stdio.h>
int main()
{
    
    
	int a = 10;
	int* pa = &a;
	*pa = 20;	
	printf("%d\n", a);
	return 0;
}

그것을 실행하고 얻을

20

a의 값이 실제로 변경된 것을 볼 수 있습니다. 이 아이디어에 따르면 a와 b의 주소를 Swap 함수에 전달합니다.

스왑(&a, &b);

그런 다음 외부 Swap 함수의 매개 변수는 포인터 변수여야 합니다. Swap(&a, &b)에 주소가 전달되고 주소가 포인터 변수에 배치되어야 하기 때문입니다.

스왑(int* px, int* py)
{ }

a의 주소는 포인터 px에 저장되고 b의 주소는 py에 저장되는데,
px가 가리키는 주소의 값(즉, a의 값)과 py가 가리키는 주소의 값( 즉, b)의 값은 변수 z를 통해 교환된다.

void Swap(int* px, int* py)
{
    
    
	int z = 0;

	z = *px;//*px相当于是a
	*px = *py;//*py相当于是b
	*py = z;
}

전체 코드는 다음과 같습니다

#include<stdio.h>
void Swap(int* px, int* py)
{
    
    
	int z = 0;

	z = *px;
	*px = *py;
	*py = z;
}
int main()
{
    
    
	int a = 10;
	int b = 20;

	printf("交换前:a=%d b=%d\n", a, b);
	//函数
	Swap(&a, &b);
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

아직 이해가 안 되더라도 당황하지 말고 어떻게 작동하는지 그림을 그려 봅시다.

주소로 호출의 원리

처음에 우리는 변수 a와 b를 만들었고 그 값은 각각 10과 20 입니다
.
b는 0x0012ff48이고;

그런 다음 Swap 함수를 통해 매개 변수를 전달하면 a(0x0012ff40)의 주소가 px에 전달되고 b의 주소(0x0012ff48)가 py에 전달됩니다. 이때 a의 주소는 px에 배치되고 주소는 px와 py를 통해 a와 b의 값을 찾아
여기에 이미지 설명 삽입
a와 b의 값을 Swap합니다.

call by value와 call by reference를 함께 넣습니다.
여기에 이미지 설명 삽입

함수 매개변수의 개념

함수 매개변수의 개념을 살펴보겠습니다:
함수 매개변수

1 실제 매개변수(실제 매개변수):

실제로 함수에 전달되는 매개변수를 실제 매개변수라고 합니다. 실제 매개변수는 상수, 변수, 표현식, 함수 등이 될 수 있습니다.
실제 매개변수가 어떤 종류의 양이든 관계없이 함수가 호출될 때 명확한 값을 가져야 이 값이 형식 매개변수로 전달될 수 있습니다.

2개의 형식 매개변수(매개변수):

형식 매개변수는 함수 이름 뒤의 괄호 안에 있는 변수를 참조합니다. 형식 매개변수는 함수가 호출될 때만 인스턴스화(할당된 메모리 단위)되기 때문에 형식 매개변수라고 합니다.
형식 매개변수는 함수 호출이 완료되면 자동으로 소멸됩니다. 따라서 형식 매개변수는 함수 내에서만 유효합니다.

위의 Swap1 및 Swap2 함수의 매개변수 x, y, px, py는 모두 공식 매개변수입니다. main 함수에서 Swap1에 전달된 a, b와 Swap2 함수에 전달된 &a, &b가 실제 매개변수입니다.

제 능력이 제한적이라 틀린 부분이 있으면 지적해주세요!
이 글이 도움이 되셨다면 좋아요관심 부탁 드립니다 !
최근에 관련 내용을 요약하고 있습니다. 나를 팔로우하고 더 많은 기사를 볼 수 있습니다.

결국, 우리는 함께 배우고 함께 발전할 것입니다!
사진 설명을 추가해주세요

추천

출처blog.csdn.net/m0_53558236/article/details/119597225