C언어/참고서: C언어 콘서트

C언어 46차시 포인터 연산, call by value, call by reference

Olivia-BlackCherry 2023. 4. 5. 23:57

1. 포인터 연산

포인터에 대해서는 +, -만 가능하다. 

포인터의 증감 연산시 증감되는 값은, 포인터가 가리키는 객체의 크기이다. 

포인터 타입에 따라 증감되는 값이 다르다. 

char 1, short 2, int 4, float 4, double 8이다. 

출처 c언어 콘서트

 

char *pc;

int *pi;

double *pd;

로 데이터타입이 다른 포인터가 세 개 있을 때, 이들을 증감시키면 아래와 같이 이동한다. 

출처 c언어 콘서트

 

 

2. 함수가 외부로부터 데이터를 받는 방법

1) call by value 값에 의한 호출

함수가 호출될 때 복사본 parameter가 전달됨. 

출처: c언어 콘서트

따라서 함수 안에서 parameter가 변경해도 원본은 변하지 않음.

버그를 막을 수 있는 좋은 방법. 

<예시>

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
void modify(int value)
{
	value = 1;
}

int main(void)
{
	int number = 2;
	modify(number);
	printf("number= %d", number); //number=2

	return 0;
}

 

2) call by reference 참조에 의한 호출

함수가 호출될 때 원본 parameter가 전달됨.

출처: c언어 콘서트

따라서 함수 안에서 parameter을 변경하면 원본도 바뀜. 

<예시 코드>

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
void modify(int *value)
{
	*value = 99;
}

int main(void)
{
	int number = 2;
	modify(&number);
	printf("number= %d", number); //number =99

	return 0;
}

 

C언어는 기본적으로 call by value이다. 

그런데 포인터를 함수에 전달하면 call by reference를 흉내낼 수 있는 것이다.  

 

 

<예시코드>

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
void swap(int *px, int *py)
{
	int tmp;

	tmp = *px;
	*px = *py;
	*py = tmp;
}

int main(void)
{
	int a = 10, b = 20;
	printf("swap() 호출 전 a =%d, b=%d\n", a, b);

	swap(&a, &b);

	printf("swap() 호출 후 a=%d, b=%d", a, b);
}