핵심 정리
함수
함수는 자주 사용되는 코드를 한 곳에 모아놓은 것을 뜻합니다.
함수를 호출할 때 함수 안에 전달하는 값을 인수라고 하며 함수가 호출 된 뒤 함수 안에서 나오는 값을 반환값이라고 합니다. 반환값이 없는 함수는 반환값 자료형에 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