유튜브 나도코딩 c언어 기초 강의내용이 포함되어 있습니다.
int a = 10;
int b = 20;
에서 a와 b의 값을 바꾸고 싶으면 어떻게 해야할까
swap함수를 구현해보자.
#include <stdio.h>
void swap(int a, int b);
int main(void)
{
int a = 10;
int b = 20;
swap(a,b);
printf("a = %d, b = %d", a, b);
return 0;
}
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
양손에 사과를 들고 있는데 그 사과 둘을 서로 바꿀 수 없는 것처럼 a와 b를 바꿀 때도 그렇다.
그래서 temp라는 임시변수를 선언해서 a와 b를 바꿔주었다.
이 코드를 실행시켜보면 a와 b는 바뀌지 않는다는 것을 알 수 있다. 왜 그럴까??
함수 호출 방법을 설명하겠다
Call by Value : 값에 의한 호출
함수를 호출할 때 값에 의한 호출은 변수나 상수를 인자로 넣어서 호출한다.
위 예처럼
swap(a,b);
는 변수에 저장된 값이 함수로 넘어가게 되는데, 이 값은 함수 내에서 매개변수로 받고 매개변수에 값이 대입된다.
위와 같이 호출하면 함수내의 매개변수가 인자로 넘어온 값으로 초기화 되는 것이다.
void swap(int a= 10, int b = 20){}
그저 값이 복사되는거고 그래서 Call by Value(값에 의한 호출)이라고 한다.
#include <stdio.h>
void swap(int a, int b);
int main(void)
{
int a = 10;
int b = 20;
printf("a 의 주소 : %d\n", &a);
printf("b 의 주소 : %d\n", &b);
printf("\n");
printf("Swap 함수 전 => a : %d, b : %d\n", a, b);
printf("\n");
swap(a, b);
printf("Swap 함수 후 => a : %d, b : %d\n", a, b);
return 0;
}
void swap(int a, int b)
{
printf("(Swap 함수 내) a의 주소 : %d \n", &a);
printf("(Swap 함수 내) b의 주소 : %d \n\n", &b);
int temp = a;
a = b;
b = temp;
printf("Swap 함수 내 => a : %d, b : %d\n", a, b);
}
함수 내에서는 a와 b가 바뀌었지만 main 함수 안에서는 a와 b가 바뀌지 않았다.
Call by Address : 주소에 의한 호출
함수를 호출할 때 주소에 의한 호출은 변수의 주소를 인자로 넣어서 호출한다.
값에 의한 호출이 인자로 변수의 값을 넘기 듯이, 주소에 의한 호출은 인자로 변수의 주소값을 넘기는 것이다.
인자로 변수의 주소값을 받기 위해서는 매개변수가 '포인터변수'여야 한다.
#include <stdio.h>
void swap_addr(int* a, int* b);
int main(void)
{
int a = 10;
int b = 20;
printf("a 의 주소 : %d\n", &a);
printf("b 의 주소 : %d\n", &b);
printf("\n(주소값 전달) Swap 함수 전 => a : %d , b : %d\n", a, b);
swap_addr(&a, &b);
printf("\n(주소값 전달) Swap 함수 후 => a : %d , b : %d\n", a, b);
return 0;
}
void swap_addr(int* a, int* b)
{
printf("(Swap 함수 내) a의 주소 : %d \n", &a);
printf("(Swap 함수 내) b의 주소 : %d \n\n", &b);
int temp = *a;
*a = *b;
*b = temp;
printf("(주소값 전달) Swap 함수 내 => a : %d , b : %d\n", *a, *b);
}
이렇게 포인터 변수를 사용한 swap함수는 함수 내에서 a와 b는 각각 main 함수 내의 a와 b의 주소값을 가지고, 그 주소가 가진 값을 바꿔서 main함수 내의 변수 a와 b를 교환하게 된다.
'c언어 기초' 카테고리의 다른 글
c언어 다차원배열 multidimensional array - 나도코딩 (0) | 2022.05.31 |
---|---|
c언어 포인터, pointer 프로젝트, 물고기 키우기 - 나도코딩 (0) | 2022.05.31 |
c언어 포인터 pointer - 나도코딩 (0) | 2022.05.30 |
c언어 배열 array - 나도코딩 (0) | 2022.05.30 |
c언어 함수 function - 나도코딩 (0) | 2022.05.29 |