반도체, 임베디드 Study/C

C - 포인터, 이중포인터 Call-by-Value, Call-by-Reference

잇(IT) 2023. 3. 28. 13:56
728x90
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int SquareByValue(int);
int SquareByReference(int*);

int main()
{
	int num = 0;

	printf("정수를 입력하시오 : ");
	scanf("%d", &num);

	SquareByValue(num);
	printf("%d \n", num);
	SquareByReference(&num);
	printf("%d \n", num);

	return 0;
}

int SquareByValue(int num)
{
	return num * num;
}

int SquareByReference(int *ptr)
{
	int num = *ptr;
	*ptr = num * num;
}

- SquareByReference 함수를 보게 되면 매개변수로 (int * ptr)을 받고 있다.

- 즉, 함수 호출 시 해당 변수의 주소값을 받아오겠다는 의미로 작용한다.

- int num = *ptr; 의 경우 *ptr은 위에서 main 함수에서 입력 받은 num의 주소값에 있는 값을 지칭하게 되고, int num은 main 함수에 정의된 num의 주소값에 있는 값을 가르키게 된다. 

- 즉, SquareByReference 함수는 매개변수의 저장된 값을 복사해 오는 것이 아닌 해당 매개변수의 주소값에 있는 값을 가져오기 때문에 함수에서 해당 주소값의 값을 변경하게 되면 main 함수에 있는 변수의 값도 변경되게 된다. 

#include <stdio.h>

void Swap(int* ptr1, int* ptr2);

int main()
{
	int num1 = 10;
	int num2 = 20;
	printf("num1 num2 : %d %d \n", num1, num2);

	Swap(&num1, &num2);
	printf("num1 num2 : %d %d \n", num1, num2);

	return 0;
}

void Swap(int* ptr1, int* ptr2)
{
	int temp = *ptr1;
	*ptr1 = *ptr2;
	*ptr2 = temp;
}
#include <stdio.h>

void SwapIntPtr(int** dp1, int** dp2);

int main()
{
	int num1 = 10, num2 = 20;
	int* ptr1, * ptr2;
	ptr1 = &num1, ptr2 = &num2;
	printf("*ptr1, *ptr2 : %d %d \n", *ptr1, *ptr2);

	SwapIntPtr(&ptr1, &ptr2);
	printf("*ptr1, *ptr2 : %d %d \n", *ptr1, *ptr2);

	return 0;
}

void SwapIntPtr(int** dp1, int** dp2)
{
	int* temp = *dp1;
	*dp1 = *dp2;
	*dp2 = temp;
}

 

728x90

'반도체, 임베디드 Study > C' 카테고리의 다른 글

C - 포인터  (0) 2024.05.13
C - 헷갈리는 개념 정리  (0) 2024.04.17