카테고리 없음

[C] 값에 의한 호출 vs 주소에 의한 호출

student0 2024. 11. 25. 14:08

C언어 관련 전공 과목을 공부하면서 값에 의한 호출 vs 주소에 의한 호출에 대해 정리한 내용을 공유해 봅니당


값에 의한 호출 & 주소에 의한 호출

값에 의한 호출

void swap(int , int);
int main(void){
	int i = 3, j = 5;
	swap(i, j);
	printf("%d %d\\n", i, j);
	/* 3 5 is printed */
	return 0;
}
void swap(int p, int q){
	int tmp;
	tmp = p;
	p = q;
	q = tmp;
}

이렇게 해서 값을 바꿔도 실제 값이 변경되지는 않는다.

void swap으로 간 변수는 함수가 끝나면 메모리 공간이 사라진다 → 즉 실제 원본 값은 변하지 않는다.

주소에 의한 호출

  1. 함수의 매개변수를 포인터 형으로 선언한다
  2. 함수 몸체에서 역참조 연산자를 사용해 주소가 가리키는 공간의 값에 직접 접근한다.
  3. 함수를 호출할 때 주소를 인자로 전달한다.
void swap(int*, int*);

int main(void)
{
	int i = 3, j = 5;
	swap(&i, &j);
	printf("%d %d\\n", i, j);
	return 0;
}

void swap(int *p, int *q)
{
	int tmp;
	int tmp = *p;
	*p = *q;
	*q = tmp;
}

위에서 swap 함수를 먼저 선언한 후 아래에서 구현

인자를 전달할 때, 변수의 주소를 전달하면서 swap 함수의 인자인 포인터들이 해당 주소값을 할당 받는다

이를 통해 실제 값을 변경한다.

<예제>

int divide_p(int, int, int*, int*);

int main () {
	int i, j, q, r;
	printf("피제수를 입력하세요 : ");
	scanf("%d", &i);
	printf("제수를 입력하세요 : ");
	scanf("%d", &j);
	if (divide_p(i, j, &q, &r)){
		printf("0으로 나눌 수 없습니다. \\n");
	}
	else {
		printf("%d / %d : 몫은 %d이고, 나머지는 %d입니다. \\n", i, j, q, r);
	}
	return 0
}

위를 만족시킬 divide_p 함수를 작성해보자

int divide_p(int i, int j, int *q, int *r){
	if (j == 0) {
		return -1;
	}
	
	*q = i / j;
	*r = i % j;
	
	return 0;
}
  • if문 → 0은 false 0이 아닌 모든 값은 true
  • true와 false를 사용할려면 stdbool.h을 include해야 한다. //_Bool로 bool의 형을 지정할 수 있다.
    • true와 false는 1과 0으로 구분하자
  • //는 파이썬에서 사용하는 연산자이다 C언어에서는 /를 사용하자
  • -1은 오류 상황인 것을 나타낸다 → 오류인 상황에는 1이 아니라 -1을 적자

수정된 최종 코드