-
[C Language] 43. 포인터 - 매개변수 처리 총정리CSE/C Language 2015. 8. 10. 11:14
1. 매개변수가 1차원 배열인 경우
1차원 배열이 int 형인 경우
1234567891011121314151617181920212223242526272829/** parameter.c** Created on: 2015. 8. 10.* Author: Yeonsu*/#include <stdio.h>void print_temp(int *, int);int main(void) {int sum;int tmp[] = { 11, 42, 19, 82, 57 };print_temp(tmp, sizeof(tmp) / sizeof(int));return 0;}void print_temp(int *tmp, int length) {int i;for (i = 0; i < length; i++)printf("tmp[%d] = %d\n", i, *tmp++);}cs 1차원 배열이 문자인 경우
1234567891011121314151617181920212223242526/** parameter.c** Created on: 2015. 8. 10.* Author: Yeonsu*/#include <stdio.h>void print_name(char *);int main(void) {char name[] = "Yeonsu Moon";print_name(name);return 0;}void print_name(char *my_name) {for (; *my_name;)putchar(*my_name++);}cs 2. 매개변수가 2차원 배열인 경우
2차원 배열이 int 형인 경우
12345678910111213141516171819202122232425262728293031323334353637383940414243444546/** parameter.c** Created on: 2015. 8. 10.* Author: Yeonsu*/#include <stdio.h>void print_element(int (*)[3]);int main(void) {int tmp[][3] = { { 6, 1, 3 }, { 5, 2, 4 } };print_element(tmp);return 0;}void print_element(int (*tmp)[3]) {int i, j;puts("첫 번째 방법");for (i = 0; i < 2; i++)for (j = 0; j < 3; j++)printf("1. [%d][%d] = %d\n", i, j, tmp[i][j]);puts("");puts("두 번째 방법");for (i = 0; i < 2; i++)for (j = 0; j < 3; j++)printf("2. [%d][%d] = %d\n", i, j, *(tmp[i] + j));puts("");puts("세 번째 방법");for (i = 0; i < 2; i++)for (j = 0; j < 3; j++)printf("3. [%d][%d] = %d\n", i, j, *(*(tmp + i) + j));}cs 2차원 배열이 문자인 경우
1234567891011121314151617181920212223242526272829303132333435363738394041/** parameter.c** Created on: 2015. 8. 10.* Author: Yeonsu*/#include <stdio.h>#define ROW 7#define COLUMN 10void print_week(char (*)[10], int);int main(void) {char days[ROW][COLUMN] = { "Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday" };print_week(days, ROW);return 0;}void print_week(char (*days)[10], int row) {int i, j;for (i = 0; i < row; i++)puts(days[i]);puts("");for (i = 0; i < row; i++) {for (j = 0; j < COLUMN; j++)putchar(days[i][j]);puts("");}}cs 문자열을 다룰 때 2차원 배열을 사용하는 경우는 거의 없다(메모리 낭비가 너무 심하기 때문이다).
위 프로그램은 print_week()의 본체에서 세번 째 for문은 문자열 출력을 마친 상태에서도 공회전한다는 것을 알 수 있다(문자열의 길이가 6이면 6번 회전해야 하는데 무조건 10번 회전한다).
이 문제는 위 구문을 아래와 같이 수정하여서 공회전을 막을 수 있다.
123for (j = 0; days[i][j]; j++)putchar(days[i][j]);cs days[i][j]가 NULL 문자이면 문자열의 끝이므로 더 이상 회전하지 않는다.
1234567891011121314151617181920212223242526272829303132333435363738/** parameter.c** Created on: 2015. 8. 10.* Author: Yeonsu*/#include <stdio.h>void print_week(char **); // 함수 선언int main(void) {char *days[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday", NULL };print_week(days); // 함수 호출return 0;}void print_week(char **days) { // 함수 본체 정의int i;for (i = 0; i < 7; i++)puts(days[i]);puts("");for (; *days; days++) {for (; **days; (*days)++)putchar(**days);puts("");}}cs 매크로를 사용하면 복잡하게 보이기 때문에 이번 예제는 매크로 변수를 삭제했다.
문자열을 포인터 배열에 저장하고 이를 활용한 것인데, 함수 선언에 * 연산자가 2개 필요하다는 것과 본체에서 받아들일 때도 2개 필요하다는 것을 알 수 있다.
그리고 puts()를 사용할 때는 2차원 배열이 문자인 경우와 같지만 문자 하나하나를 출력하는 것은 문자배열보다 복잡해 보일 것이다.
하지만 사실 이것은 하나의 기교일 뿐 2차원 배열이 문자일 경우와 같다. 그러므로 다음처럼 사용해도 무방하다.
1234567for (i = 0; i < 7; i++){for (j = 0; days[i][j]; j++)putchar(days[i][j]);puts("");}cs 'CSE > C Language' 카테고리의 다른 글
[C Language] 이클립스 C/C++ 개발 환경 구축 !! (0) 2015.09.16 [C Language] 42. void형 포인터 - C 언어 (0) 2015.08.05 [C Language] 41. 포인터의 개념을 깨는 '0' (0) 2015.08.05 [C Language] 40. 문자열 함수 - C 언어 (0) 2015.08.05 [C Language] 39. 포인터의 포인터 - C 언어 (0) 2015.08.05 [C Language] 38. 문자열과 포인터 - C 언어 (0) 2015.08.04