c언어

[C언어]포인터와 함수

kidmillionaire1998 2022. 9. 7. 14:19

숭실대학교 김익수 교수님의 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