지금까지 주절주절 거리며 떠들었던 것들에 대한 예시들을 살펴보도록 하겠습니다.
예제에 대한 설명들은 다 안하고... 그냥 제가 살펴보고 싶은 것만... 하하...
쉬운 코드들이라... 그냥 보시는 데에도 문제 없으실 것입니다.
말씀은 안드렸지만, 이번 '곱씹어보자 C!' 기획은...
C언어를 아시는 상태에서 한번 훑어보며 기억을 다시한번 잡아보자 하는 마음에 올리게 되기에...
아무래도 저의 화려한 삽잡이의 캐릭터와 (ㅋㅋㅋㅋ) 그림들이 없어 밋밋한 면이 있죠...
아무튼...
그 전에 우선 하나 확실하게 다시 알아보고 갑시다.
지난 번에 설명한 것인데요...
이번에 올릴 예시들을 이해하는데 도움이 많이 될것 같아서요!
다른 함수로 요청을 할 때에 매개변수를 보낸다고 했었습니다.
그런데, 그 매개변수에는 사용하는 목적에 따라 두가지로 나뉘죠.
우선 출력 매개 변수 (Out Parameter) 를 이해해봅시다.
고갱님(Client)께서 서버에게 뭔가를 바라고 던져주는 변수라고 생각하시면 됩니다.
예를들어 우리가 흔히 사용하는 scanf 를 예시로 들어보죠...
1 | scanf("%d", &n); | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | int AddArray(int* parr, int size) { int i; int sum = 0; for (i = 0; i < size; ++i) { sum += parr[i]; } return sum; } void main() { int arr[] = { 1, 2, 3, 4 }; int sum; sum = AddArray(arr, 4); printf("sum = %d", sum); } | cs |
우선, AddArray 라는 함수의 매개변수에서 parr 은 출력 매개변수라고 할 수 있습니다.
코드를 해석해보시면 아시겠지만, parr 이라는 변수에 값을 집어넣죠...
바로 main의 요청에 의한 요구를 들어주니... 아웃파라메터 즉 출력 매개변수라고 할 수 있습니다.
main 함수에서 보시면 아시겠지만,
배열을 보낼 때에는 배열의 이름(시작 주소)와 개수를 보내죠..
왜냐하면 통채로 넘기는 방법은 아쉽게도 C언어에서는 없습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | void main() { char buf[100]; while (1) { gets(buf); if (strcmp(buf, "exit") == 0) break; puts(buf); } } | cs |
이 예시는...
입력받은 문자열이 저장되어 있는 배열에서 "exit" 라는 문자가 있으면
멈추겠다는 내용입니다.
여기서 비교하기 위해 사용된 함수는 strcmp 입니다. 참고로 string 헤더파일에 있습니다.
아무튼...
함수의 기능이 좋다 이런 것을 말하고 싶은 것이 아니라,
혹여나 '("buf == "exit") 이렇게 사용하면 되지 않나' 라고 생각하시는 분들이 계실까봐요...
buf는 배열로써 시작 주소를 가리키고 있고요,
"exit" 같은 경우 문자열로써 문자열 시작주소를 가리키고 있습니다.
우리는 주소가 같은지 확인하는 것이 아니죠... 그렇게 비교하시면 안됩니다~!
참고로 말씀드리자면,
문자열 복사하시려고 하는 분들 계시다면 strcpy 함수를 사용하세요. string 헤더파일에 있고요,
1 2 3 | char arr[500]=""; arr = "abc"; | cs |
이런식으로 쓰시면 복사가 안됩니다.
"abc"는 문자열 시작주소인데, 주소는 상수죠... 상수 주소를 넣으려고 하면
이런 시도를 하시는 여러분께서 원하시는 결과는 나오지 않습니다... 허허...
마지막으로 살펴볼 예시입니다. 중간 중간만 올리도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | // 중략 void InitInteager(int* pdCount) { *pdCount = 0; } void UninitInteager(int* pdCount) { *pdCount = 0; } // 중략 int dArray[100]; int dCount; int bRun = 1; InitInteager(dArray, &dCount); while (bRun) // 중략 } } UninitInteager(dArray, &dCount); } | cs |
좀 중략이 있습니다... 뭐 다 볼 필요는 없으니까요 하하...
제가 말씀드리고 싶은 것은 바로,
InitInteager() 함수와 UninitInteager() 함수입니다.
표준라이브러리에 저런 함수들은 없습니다.
단순히 기능을 설명해드리자면, 초기화를 해주는 기능을 가지고 있습니다.
C언어에 있어서 초기화란 반드시 있어야 하는 기능입니다.
왜냐 데이터와 기능을 초기화 하는 작업을 C에서는 직접 해줘야하기 때문입니다.
기능이 시작되기 전 처음 초기화와 코드 끝 지점에 마무리 작업을 해주는 것입니다.
초기화와 마무리는 큰 프로젝트를 하게 된다면 필히 해야한다고 합니다.
오늘은 여기까지 하겠습니다~
'삽질의 현장 > - C' 카테고리의 다른 글
곱씹어보자 C!_#016_삽잡이의 두서없이 막하는 배열 포인터 (0) | 2015.06.26 |
---|---|
곱씹어보자 C!_#015_삽잡이의 두서없이 막하는 2차원 배열 (0) | 2015.06.26 |
[삽잡이::C] 연산자 (0) | 2015.06.25 |
곱씹어보자 C!_#013_ 삽잡이의 두서없이 막말하는 함수(2) (0) | 2015.06.25 |
곱씹어보자 C!_#012_ 삽잡이의 두서없이 막말하는 함수(1) (0) | 2015.06.25 |