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
아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
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 |