본문 바로가기

자린고비 독학하기/자린고비 코딩하기

C 언어 코딩 도장 빨리 끝내기 - 5: 함수의 기본 / 매개변수의 다양성

반응형

 

 

c 언어 기초 그만 좀 보고 싶어서 빨리 끝내 보려고 합니다 

5: 함수의 기본 / 매개변수의 다양성 

 

 

핵심 정리 1: https://dojang.io/mod/page/view.php?id=778

 

C 언어 코딩 도장: 핵심 정리

함수 함수는 자주 사용되는 코드를 한 곳에 모아놓은 것을 뜻합니다. 함수를 호출할 때 함수 안에 전달하는 값을 인수라고 하며 함수가 호출 된 뒤 함수 안에서 나오는 값을 반환값이라고 합니다. 반환값이 없는 함수는 반환값 자료형에 void를 지정합니다. // 반환값과 매개변수가 없는 함수 정의 void 함수이름() { 코드; } 함수(); // 함수 호출 반환값은 함수 안에서 return으로 반환합니다. 이때 반환값 자료형과 반환하는 값(변수)은 자료형이

dojang.io

 

 

핵심 정리

함수

함수는 자주 사용되는 코드를 한 곳에 모아놓은 것을 뜻합니다.

함수를 호출할 때 함수 안에 전달하는 값을 인수라고 하며 함수가 호출 된 뒤 함수 안에서 나오는 값을 반환값이라고 합니다. 반환값이 없는 함수는 반환값 자료형에 void를 지정합니다.

// 반환값과 매개변수가 없는 함수 정의 void 함수이름() { 코드; } 함수(); // 함수 호출

반환값은 함수 안에서 return으로 반환합니다. 이때 반환값 자료형과 반환하는 값(변수)은 자료형이 같아야 합니다.

// 반환값이 있는 함수 정의 반환값자료형 함수이름() // 반환값 자료형과 반환하는 값은 자료형이 같아야 함 { return 반환값; } 변수 = 함수(); // 함수를 호출한 뒤 반환값을 변수에 저장

함수가 호출될 때 전달받은 값은 매개변수를 통해서 사용할 수 있습니다.

// 매개변수가 있는 함수 정의 반환값자료형 함수이름(자료형 매개변수1, 자료형 매개변수2) { } 함수(1, 2); // 함수를 호출하면서 인수 전달

매개변수와 인수

함수 바깥에서 전달된 값이 저장되는 변수를 매개변수라 부릅니다.

int add(int a, int b) // a와 b가 매개변수 { return a + b; }

함수를 호출할 때 전달하는 값이나 변수를 인수라 부릅니다.

add(10 , 20); // 10과 20이 인수

함수에서 포인터 매개변수와 반환값 사용하기

함수에서는 일반적인 값뿐만 아니라 포인터(메모리 주소)도 반환할 수 있습니다. 포인터를 반환하는 함수를 만들려면 반환값 자료형과 함수 사이에 * (애스터리스크)를 붙이면 됩니다.

// 포인터를 반환하는 함수 정의 반환값자료형 *함수이름() // 반환값 자료형과 반환하는 값은 자료형이 같아야 함 { return 반환값; }

단, 함수 안에서 & 연산자로 변수의 메모리 주소를 반환하면 안 됩니다. 매개변수와 함수 안에서 선언한 변수는 함수가 끝날 때 모두 사라집니다. 그러므로 함수 안에서만 쓸 수 있는 변수의 주소를 반환하면 안 됩니다.

함수에서 구조체 반환값 사용하기

함수에서 구조체를 반환할 때는 반환값 자료형에 struct 키워드와 구조체 이름을 지정한 뒤 return으로 구조체 변수를 반환합니다.

struct 구조체이름 함수이름() { return 구조체변수; }

구조체 포인터를 반환할 때는 반환값 자료형에서 구조체 이름과 함수 사이에 *를 붙인 뒤 return으로 구조체 포인터를 반환합니다.

struct 구조체이름 *함수이름() { return 구조체포인터; }

함수에서 구조체 반환값의 복사

함수에서 구조체 변수를 반환한 뒤 다른 변수에 저장하면 구조체의 내용을 모두 복사하게 됩니다. 구조체의 크기가 커지면 그만큼 공간이 더 필요하게 되므로 비효율적입니다.

struct 구조체이름 함수이름() { return 구조체변수; } 구조체변수 = 함수(); // 반환된 구조체의 내용이 모두 구조체 변수에 복사됨

malloc 함수로 구조체 포인터에 동적 메모리를 할당한 뒤 반환하면 구조체 복사가 일어나지 않아서 효율적입니다.

struct 구조체이름 *함수이름() { // malloc 함수로 구조체 포인터에 메모리를 할당 return 구조체포인터; // 구조체 포인터 반환 } 포인터 = 함수(); // 포인터(메모리 주소)만 반환됨 free(포인터); // 동적 메모리 해제

Visual Studio 디버거 사용하기

  • 중단점 삽입/삭제: 소스 코드 편집 창에서 마우스 오른쪽 버튼 클릭하고 중단점(B) > 중단점 삽입(R) 또는 F9
  • 중단점 삽입/삭제: 소스 코드 편집 창에서 마우스 오른쪽 버튼 클릭하고 중단점(B) > 중단점 삽입(R) 또는 F9
  • 디버깅 중지: 디버그(D) > 디버깅 중지(E) 또는 Shift+F5
  • 프로시저 단위 실행: 디버그(D) > 프로시저 단위 실행(O) 또는 F10
  • 한 단계씩 코드 실행: 디버그(D) > 한 단계씩 코드 실행(I) 또는 F11
  • 프로시저 나가기: 디버그(D) > 프로시저 나가기(T) 또는 Shift+F11

 

 

핵심 정리 2: https://dojang.io/mod/page/view.php?id=779

 

C 언어 코딩 도장: 핵심 정리

함수에서 포인터 매개변수 사용하기 함수에서 포인터를 매개변수로 지정하면 역참조로 값을 가져올 수 있습니다. // 포인터를 매개변수로 사용하는 함수 정의 반환값자료형 함수이름(자료형 *매개변수1, 자료형 *매개변수2) { *매개변수1 = 값; // 역참조로 값 저장 } 함수(&변수); // 함수를 호출하면서 변수의 메모리 주소(포인터) 전달 // 함수에서 역참조로 저장한 값이 변수에 저장됨 함수에서 배열 매개변수 사용하기 함수에서 배열을 매개변수로 사용하려

dojang.io

 

 

핵심 정리

함수에서 포인터 매개변수 사용하기

함수에서 포인터를 매개변수로 지정하면 역참조로 값을 가져올 수 있습니다.

// 포인터를 매개변수로 사용하는 함수 정의 반환값자료형 함수이름(자료형 *매개변수1, 자료형 *매개변수2) { *매개변수1 = ; // 역참조로 값 저장 } 함수(&변수); // 함수를 호출하면서 변수의 메모리 주소(포인터) 전달 // 함수에서 역참조로 저장한 값이 변수에 저장됨

함수에서 배열 매개변수 사용하기

함수에서 배열을 매개변수로 사용하려면 매개변수 이름 뒤에 [ ] (대괄호)를 붙이거나 포인터로 지정해줍니다.

// 배열을 매개변수로 사용하는 함수 정의 반환값자료형 함수이름(자료형 매개변수[]) { } // 매개변수를 포인터로 지정해도 배열을 받을 수 있음 반환값자료형 함수이름(자료형 *매개변수) { }

함수에서 2차원 배열 매개변수 사용하기

매개변수로 2차원 배열을 사용하려면 [ ] (대괄호)를 두 개 붙인 뒤 가로 크기를 지정합니다. 또는 매개변수 앞에 * (애스터리스크)를 붙이고 괄호로 묶은 뒤 대괄호에 가로크기를 지정하면 됩니다.

// 2차원 배열을 매개변수로 사용하는 함수 정의 반환값자료형 함수이름(자료형 매개변수[][가로크기]) { } // 2차원 배열을 매개변수로 사용하는 함수 정의 반환값자료형 함수이름(자료형 (*매개변수)[가로크기]) { }

함수에서 구조체 매개변수 사용하기

매개변수로 구조체를 사용하려면 struct 키워드와 구조체 이름을 지정합니다. 구조체 포인터를 사용할 때는 구조체 이름 뒤에 *를 붙입니다.

반환값자료형 함수이름(struct 구조체이름 매개변수) { } 반환값자료형 함수이름(struct 구조체이름 *매개변수) { }

 

 

 

핵심 정리 3: https://dojang.io/mod/page/view.php?id=780

 

C 언어 코딩 도장: 핵심 정리

함수에서 가변 인자 사용하기 함수의 매개변수 개수가 정해지지 않은 방식을 가변 인자(가변 인수)라고 합니다. 단, 고정 매개변수는 1개 이상 있어야 합니다. 반환값자료형 함수이름(자료형 고정매개변수, ...) { } 가변 인자는 stdarg.h 헤더 파일에 정의된 va_list, va_start, va_arg, va_end로 사용합니다(그림 65-1, 그림 65-2 참조). va_list: 가변 인자 목록. 가변 인자의 메모리 주소를 저장하는 포인터입니다

dojang.io

 

 

핵심 정리

함수에서 가변 인자 사용하기

함수의 매개변수 개수가 정해지지 않은 방식을 가변 인자(가변 인수)라고 합니다. 단, 고정 매개변수는 1개 이상 있어야 합니다.

반환값자료형 함수이름(자료형 고정매개변수, ...) { }

가변 인자는 stdarg.h 헤더 파일에 정의된 va_list, va_start, va_arg, va_end로 사용합니다(그림 65-1, 그림 65-2 참조).

  • va_list: 가변 인자 목록. 가변 인자의 메모리 주소를 저장하는 포인터입니다.
  • va_start: 가변 인자를 가져올 수 있도록 포인터를 설정합니다.
  • va_arg: 가변 인자 목록 포인터에서 지정된 자료형만큼 값을 가져온 뒤 포인터를 순방향으로 이동시킵니다(다음 인자의 위치로 이동).
  • va_end: 가변 인자 처리가 끝났을 때 포인터를 NULL로 초기화합니다.

// 가변 인자 함수 선언 및 정의 void printNumbers(int args, ...) // 가변 인자의 개수를 받음, ...로 가변 인자 설정 { va_list ap; // 가변 인자 목록 포인터 va_start(ap, args); // 가변 인자 목록 포인터 설정 for (int i = 0; i < args; i++) // 가변 인자 개수만큼 반복 { int num = va_arg(ap, int); // int 크기만큼 가변 인자 목록 포인터에서 값을 가져옴 // ap를 int 크기만큼 순방향으로 이동 printf("%d ", num); // 가변 인자 값 출력 } va_end(ap); // 가변 인자 목록 포인터를 NULL로 초기화 } // 가변 인자 함수 호출 printNumbers(1, 10); printNumbers(2, 10, 20); printNumbers(3, 10, 20, 30); printNumbers(4, 10, 20, 30, 40);

함수의 재귀호출

함수 안에서 함수 자기자신을 호출하는 방식을 재귀호출이라 합니다. 재귀호출은 알고리즘을 구현할 때 자주 사용합니다.

// 재귀호출로 팩토리얼을 구하는 함수 int factorial(int n) { if (n == 1) // n이 1일 때 return 1; // 1을 반환하고 재귀호출을 끝냄 return n * factorial(n - 1); // n과 factorial 함수에 n - 1을 넣어서 반환된 값을 곱함 }

재귀호출은 반드시 정지 조건을 만들어주어야 합니다. 정지 조건이 없으면 함수가 계속 호출되다가 스택 오버플로우 에러가 발생합니다.

함수 포인터 사용하기

함수 포인터는 함수를 저장하는 포인터를 뜻합니다. 함수 포인터를 활용하면 함수를 자유롭게 주고 받거나 함수 호출을 자동화 할 수 있습니다.

// 함수 포인터 선언 반환값자료형 (*함수포인터이름)(); int (*fp)(); // 매개변수가 두 개인 함수 포인터 선언 반환값자료형 (*함수포인터이름)(매개변수자료형1, 매개변수자료형2); int (*fp)(int, int); // 함수 포인터 배열 선언 반환값자료형 (*함수포인터이름[크기])(매개변수자료형1, 매개변수자료형2); int (*fp[10])(int, int); // 함수 포인터를 구조체 멤버로 사용 struct 구조체이름 { 반환값자료형 (*함수포인터이름)(매개변수자료형1, 매개변수자료형2); }; struct Calc { int (*fp)(int, int); }; // 함수 포인터를 함수의 매개변수로 사용 반환값자료형 함수이름(함수포인터반환값자료형 (*함수포인터이름)(함수포인터매개변수자료형1, 함수포인터매개변수자료형2)) { } void executer(int (*fp)(int, int)) { } // 함수 포인터를 함수의 반환값으로 사용 함수포인터반환값자료형 (*함수이름(매개변수자료형 매개변수))(함수포인터매개변수자료형1, 함수포인터매개변수자료형2) { } int (*getAdd())(int, int) { } // typedef로 함수 포인터 별칭 정의 typedef 반환값자료형 (*함수포인터별칭)(매개변수자료형1, 매개변수자료형2); typedef int (*FP)(int, int); // 함수 포인터 별칭으로 함수 포인터 선언 함수포인터별칭 함수포인터변수; FP fp;

반응형