함수 응용1 : 매개변수 전달방법, 스택 프레임 그리는 방법
* 매개변수 전달 방법
- Call by value
- Call by reference ---> 포인터
* 스택 프레임 그리는 방법 ---> 중요
-------------------------------------------------- 함수 응용1
* 재귀호출
- 재귀호출을 이용한 문자열 출력
- 재귀호출의 장/단점
* 문자/문자열 처리 함수
- 문자 처리 함수
- 문자열 처리 함수
- 유니코드 문자열
* 유틸리티 함수
- atoi, atol, atof
- time, localtime, ctime
- srand, rand
- system, exit
-------------------------------------------------- 함수 응용2
----------------------------------------------------------------------------------------------------------------
* 매개변수 전달 방법
----------------------------------------------------------------------------------------------------------------
main() 내의 함수
- main() : caller
- 내의 함수 : callee
- caller는 callee를 호출할때 '실인수'를 정의
- caller에게 반환하는 값은 또한 임시 결과이다
binding : caller와 callee로 묶임
----------------------------------------------------------------------------------------------------------------
call by reference
----------------------------------------------------------------------------------------------------------------
ex)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void TestFunc(int *pnParam)
{
*pnParam =10;
}
int main(void)
{
int nData=0;
TestFunc(&nData);
printf("%d\n",nData);
return 0;
}
-----------------------------
10
-----------------------------
ex)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 주소를 반환하는 사용자 정의 함수 선언
char* GetName(void)
{
char *pszName=NULL;
//메모리 동적 할당
pszName=(char*)calloc(32,sizeof(char));
printf("이름을 입력하세요 : ");
//동적 할당한 메모리에 사용자 입력 문자열 저장
gets_s(pszName, sizeof(char)*32);
return pszName;
}
int main(void)
{
char *pszName=NULL;
//이름이 저장된 동적 할당 메모리의 주소 반환
pszName=GetName();
printf("당신의 이름은 %s 입니다.\n", pszName);
//호출자 함수가메모리를 해제
free(pszName);
return 0;
}
-----------------------------
이름을 입력하세요 : 탐 크루즈
당신의 이름은 탐 크루즈 입니다.
-----------------------------
ex) Swap
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Swap(int *pLeft, int *pRight)
{
int nTmp = *pLeft;
*pLeft = *pRight;
*pRight = nTmp;
}
int main(void)
{
int a = 10, b = 20;
Swap(&a, &b);
printf("%d, %d\n", a,b);
return 0;
}
-----------------------------
20, 10
-----------------------------
----------------------------------------------------------------------------------------------------------------
잘못된 주소 전달
----------------------------------------------------------------------------------------------------------------
ex) 사라질 메모리의 주소를 반환하는 것
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int* TestFunc(void)
{
int nData = 10; // 지역/자동 변수 nData의 주소를 반환. 값이 나와도 잘못된 로직임!!
return &nData;
}
int main(void)
{
printf("%d\n", *TestFunc());
return 0;
}
----------------------------------------------------------------------------------------------------------------
스택 프레임 그리는 방법
----------------------------------------------------------------------------------------------------------------
- 함수 내부에 선언된 변수와 매개변수는 기본적으로 '스택'을 사용
- 스택과 메모리의 주소는 반대 방향으로 그린다
- 스택 메모리 공간
> 변수 선언시마다 쌓이는 구조
> cf. 스택에 넣기 : push, 스택에서 빼 읽기 : pop
> int a,b;
.. |
.. |
.. |
b |
a |
> a를 먼저 스택에 push 했다