Small Grey Outline Pointer 포인터와 함수의 관계/call by value/call by reference
본문 바로가기
Dev./C++

포인터와 함수의 관계/call by value/call by reference

by sso. 2022. 3. 27.

<두 변수의 값을 바꾸는 알고리즘>

 

#include <stdio.h>

void main() {

	int x = 10 , y = 20;
	printf("x: %d, y:%d\n", x, y);
	x = y;
	y = x;
	printf("x: %d, y:%d\n", x, y);
	//이렇게 하면 내가 원하는 값의 교환이 이뤄지지 않는다, x값이 덮어 씌워 지기 때문
}

<결과>

<결과>

x: 10, y:20
x: 20, y:20

 

#include <stdio.h>

void main() {

	int x = 10 , y = 20;
	int temp;
	printf("x: %d, y:%d\n", x, y);
	temp = x;
	x = y;
	y = temp;
	printf("x: %d, y:%d\n", x, y);
	
}

<결과>

x: 10, y:20
x: 20, y:10

 

 


 

 

<swap 함수 사용하기>

#include <stdio.h>

void swap(int, int);
void main() {

	int x = 10 , y = 20; //main의 지역변수
	int temp;
	printf("x: %d, y:%d\n", x, y);
	swap(x, y);
	printf("main: x: %d, y:%d\n", x, y);
	
}

void swap(int x, int y) { //swap 매개변수
	int temp;
	temp = x;
	x = y;
	y = temp;
	printf("swap( ) 실행!\n");
	printf("swap: x: %d, y:%d\n", x, y);
}

<결과>

x: 10, y:20
swap( ) 실행!
swap: x: 20, y:10
main: x: 10, y:20

 

 

swap()을 실행하면, swap() 함수 내 x,y 값은 변경이 되어 있으나

실제 main 에서 생성된 x,y 값은 변경 되지 않는다

=> 함수의 호출이 call by value(값에 의한 호출) 이기 때문에 

 

 

 


 

 

<변수를 사용하는 것과 포인터를 사용하는 것의 차이>

포인터 사용해서 매개변수를 만들면 입력한 변수에게 영향을 줄 수 있다

#include <stdio.h>

void swap(int*, int*);
void main() {

	int x = 10 , y = 20;
	int temp;
	printf("x: %d, y:%d\n", x, y);
	swap(&x, &y);
	printf("main: x: %d, y:%d\n", x, y);
	
}

void swap(int *px, int *py) {
	int temp;
	temp = *px; //간접참조연산자로 주소에 접근
	*px =*py;
	*py = temp;
	printf("swap( ) 실행!\n");
	printf("swap: x: %d, y:%d\n", *px, *py);
}

<결과>

x: 10, y:20
swap( ) 실행!
swap: x: 20, y:10
main: x: 20, y:10

 

 

실제 main에서 생성된 값을 전달하기 위해

main 에서 생성된 변수 x,y의 주소값을 함수에 전달 한다

따라서 함수의 매개변수는 전달된 주소를 저장할 수 있는 포인터로 생성해야 한다

 

void swap(int*, int*); //swap 함수의 매개변수가 포인터로 만들어지고

&x, &y // 주소값이 해당 포인터에 전달 됨

 

 

swap(int *px, int *py) 내에서는 temp는 정수형 변수,

px와 py는 매개변수로 전달된 변수 x, y의 주소를 저장할 정수형 포인터이므로,

간접참조연산자(*) 를 사용해서 해당 주소에 접근해 값을 전달하고 저장해야 한다

 

 

이렇게 함수의 매개변수에 값을 저장할 때

 

값이 복사되어 전달 되면 Call By Value 방식 (값에 의한 호출)

변수의 주소가 전달되면 Call By Adress 방식 ( 주소에 의한 호출)

728x90

'Dev. > C++' 카테고리의 다른 글

배열과 포인터 종합문제  (0) 2022.03.27
포인터 배열과 배열 포인터  (0) 2022.03.27
visual studio 디버깅 하기  (0) 2022.03.26
포인터의 목적/메모리의 동적 할당  (0) 2022.03.25
문자열 연습문제  (0) 2022.03.23

댓글