728x90

 

인수 전달 방법

: 함수 호출 시 인수 전달 방법

 

값에 의한 호출(Call By Value)

  • 기본적인 방법
  • 함수로 값의 복사본이 전달된다.
  • 실제 값 자체는 바뀌지 않는다.

 

참조에 의한 호출(Call By Reference = Call By Address)

  • 함수로 원본(주소값)이 전달된다.
  • 주소에 의한 전달이므로 실제 값 자체가 바뀐다.

 

 

값에 의한 호출 VS 참조에 의한 호출

값에 의한 호출(Call By Value)

 

#include <stdio.h>
void swap(int x, int y);

int main(void)
{
	int a = 100, b = 200;
	printf("a=%d b=%d\n",a, b);

	swap(a, b);

	printf("a=%d b=%d\n",a, b);
	return 0;
}
// 함수에서의 값 교환은 함수 내에서만 적용된다.
void swap(int x, int y)
{
	int tmp;
	printf("x=%d y=%d\n",x, y);

	tmp = x;
	x = y;
	y = tmp;

	printf("x=%d y=%d\n",x, y);
}

 

참조에 의한 호출(Call By Reference)

#include <stdio.h>
void swap(int *x, int *y);

int main(void)
{
	int a = 100, b = 200;
	printf("a=%d b=%d\n",a, b);

	swap(&a, &b);

	printf("a=%d b=%d\n",a, b);
	return 0;
}
// 함수에서의 값 교환이 main함수에도 적용된다.
void swap(int *px, int *py)
{
	int tmp;

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

}

 

Ex1. 2개 이상의 반환값
#include <stdio.h>
// 기울기와 y절편을 반환하기위해 포인터형 인수로 받음
int get_line_parameter(int x1, int y1, int x2, int y2, float *slope, float *yintercept)
{
	if( x1 == x2 ) 
		return -1;
	else {
	  *slope = (float)(y2 - y1)/(float)(x2 - x1);
	  *yintercept = y1 - (*slope)*x1;
	  return 0;
	}
}
int main(void) {
	float s, y;
	if( get_line_parameter(3,3,6,6,&s,&y) == -1 )
		printf("Error\n");
	else 
		printf("기울기 : %.2f\ny절편 : %.2f\n", s, y);
	return 0;
}

 

포인터와 배열

  • 포인터 ↔ 배열
  • 배열명은 포인터로 사용된다.
    (배열명은 배열 첫번째 원소의 주소값을 가리키는 포인터이다.)
  • 인덱스 표기법을 포인터에 사용할 수 있다.
#include <stdio.h>

int main(void)
{
	int a[] = { 10, 20, 30, 40, 50 };

	printf("&a[0] = %u \n", &a[0]); 
	printf("&a[1] = %u \n", &a[1]); 
	printf("&a[2] = %u \n", &a[2]); 

	printf("a = %u \n", a); 

	return 0;
}

 

Ex2. 배열의 연산을 통한 포인터와의 관계성
#include <stdio.h>

int main(void)
{
int a[] = { 10, 20, 30, 40, 50 };
printf("a = %u \n", a);
printf("a + 1 = %u \n", a + 1);
printf("sizeof(a[0]) = %d \n\n", sizeof(a[0]) );

printf("a[0]=%d a[1]=%d \n",a[0], a[1]);
printf("*a = %d \n", *a);
printf("*(a+1) = %d \n", *(a+1) );
printf("a = %d  a+1 = %d \n\n", a, a+1 );
return 0;
}

💡 포인터 변수에의 증감은 데이터 타입의 메모리 크기에 따라 이루어진다.

 

배열 매개 변수

  • 일반 매개 변수(Call By Value)
void sub(int x)
{
	...
}
  • 배열 매개 변수(Call By Reference)
void sub( int b[] )
{
	...
}

💡 배열은 포인터와 같은 취급을 하기 떄문에 배열을 매개 변수로 전달할 때는 Call By Reference 방식으로 전달해야한다.

 

Ex3
#include <stdio.h>

void sub(int b[], int n);

int main(void)
{
	int a[3] = { 1,2,3 };
	
	printf("%d %d %d\n", a[0], a[1], a[2]);
	sub(a, 3);
	printf("%d %d %d\n", a[0], a[1], a[2]);
	
	return 0;
}

void sub(int b[], int n)
{
	b[0] = 4;
	b[1] = 5;
	b[2] = 6;
}

 

배열 매개 변수의 활용

  • 배열 매개 변수
void sub(int b[], int size)
{
	for (int i = 0, j = 1; i < size; i++, j++)
		b[i] = j;
}

└ 인덱스 표기법으로 구현

  • 포인터 매개 변수
void sub(int *b, int size)
{
	int j = 1;
	for (int i = 0; i < size; i++){
		*b++ = j++;
	}
}

└ 포인터 표기법으로 구현

 

📢 함수에서 포인터 반환 시, 지역 변수의 주소 반환 ❌ 유의!
지역 변수는 함수가 종료되면 사라지므로 에러가 발생한다.

int *add(int x, int y)
{
	int result;

	result = x + y;
	return &result;
}
728x90

 

 

 


 

 

 

 

포인터(2)

인수 전달 방법

www.notion.so

 

아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!

수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑

 

 

 

C 언어 이론 정리

조건문, 반복문 사용 시 중괄호로 명령문들 묶어주기 - 명령문 1개일 때 포함 (코드 수정 시 오류 방지)

www.notion.so

 


 

개발 환경

Visual Studio 2019
Visual Studio Code

작성 플랫폼

Notion

 

728x90

'🧑‍💻 Language > C·C++' 카테고리의 다른 글

[C 이론] 14. 문자와 문자열(2)  (0) 2021.06.05
[C 이론] 13. 문자와 문자열(1)  (0) 2021.06.05
[C 이론] 11. 포인터(1)  (0) 2021.06.01
[C 이론] 10. 배열  (0) 2021.05.26
[C 이론] 9. 함수와 변수  (0) 2021.05.13