숭실대학교 김익수 교수님의 2022-2학기 프로그래밍 응용 및 실습 강의를 정리 및 재구성했다.
[값에 의한 호출 (Call by value) VS 주소에 의한 호출 (Call by address)]
[값에 의한 호출]
: C는 인자 전달 방법으로 "값에 의한 호출" 메커니즘을 사용한다.
- 변수가 함수의 인자로 전달될 때, 변수의 복사본이 전달된다. 그러므로, 호출한 환경의 변수 자체(원본)는 변경되지 않는다.
[값에 의한 호출 예제]
#include <stdio.h>
void swap(int, int);
int main(void) {
int i=3, j=5;
swap(i,j);
printf("%d %d\n", i,j); // 출력값: 3 5 (값이 변경되지 않음)
return 0;
}
void swap(int p, int q) { //swap 함수
int tmp;
tmp = p;
p = q;
q = tmp;
}
swap함수 내의 p와 q는 서로 교환이 되지만, 이는 매개변수이며, main 함수의 원본 변수인 i와 j는 변경되지 않는다. swap함수 호출이 지난 후에, p와 q의 값은 사라진다.
[주소에 의한 호출]
-C에서 "주소에 의한 호출"을 통해 원본에 접근한다.
1. 함수 매개변수를 포인터 형으로 선언
2. 함수 몸체에서 역참조 연산자 사용
3. 함수를 호출할 때 주소를 인자로 전달
[주소에 의한 호출 예제]
#include <stdio.h>
void swap(int *, int *);
int main (void) {
int i=3, j=5;
swap(&i,&j);
printf("%d %d\n",i,j); //5 3이 출력된다. 원본 값인 i와 j가 서로 교환된다.
return 0;
}
void swap(int * p, int *q) {
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
[예제 프로그램 (정수 나눗셈)]
#include <stdio.h>
int divide_p(int,int,int*,int*);
int main(void) {
int i,j,q,r; //i와 j값은 제수와 피제수이므로 바뀌지 않는다. //q와 r에 몫과 나머지를 저장한다.
printf("피제수를 입력하세요. : ");
scanf("%d",&i);
printf("제수를 입력하세요. : ");
scnaf("%d",*j);
if(divide_p(i,j,&q,&r))
printf("0으로 나눌 수 없습니다.\n");
else
printf("%d / %d : 몫은 %d이고 나머지는 %d입니다. \n", i , j, q, r);
}
int divide_p(int dividend,int divisor ,int* quotient,int* rem)
{
if(divisor ==0)
return -1;
*quotient = dividend / divisor;
* rem = dividend * divisor;
return 0;
}
/* return quotient;
return rem; => 처음 return문만 실행되므로 불가능하다.
return quotient, rem; => rem변수만 return되므로 불가능하다.
*/
'c언어' 카테고리의 다른 글
[C언어] 비트 수준 접근 (0) | 2022.10.23 |
---|---|
[C언어] 공용체(union) / 열거형 (0) | 2022.10.12 |
[C언어] 동적 메모리 할당 (0) | 2022.09.07 |
[C언어] 포인터와 배열 (0) | 2022.09.07 |
[C언어] 포인터 기본 (0) | 2022.09.06 |