반응형
36강. 배열을 매개변수로 넘기기
1) 1차원 배열을 매개변수로 넘기기
int main() {
int arr[4] = { 1,2,3,4 };
for (int i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}
}
int arr[4] = { 1,2,3,4 };
void printArr() {
for (int i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}
}
int main() {
printArr();
}
그런데 arr[4]를 전역변수로 하고싶지 않을때는 어떻게 하느냐.
void printArr(int arr[4]) {
for (int i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[4] = { 1,2,3,4 };
printArr(arr);
}
call-by-value : 값만 전달
call-by-reference : 참조를 전달
printArr은 어떤것일까 -call-by-reference임
void printArr(int arr[4]) {
for (int i = 0; i < 4; i++) {
arr[i] *= 2;
}
}
int main() {
int arr[4] = { 1,2,3,4 };
printArr(arr);
for (int i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}
}
결과 : 2 4 6 8
포인터랑 배열은 관련이 많음.
c언어가 인식할때 arr[4]는 *arr 랑 똑같은 표현이다.
arr[i] = *(arr+i)
니까
arr[0] = *arr 이다.
그러므로 주소지에 있는 실제 값이 바뀐것이므로 printArr은 Call-by-reference 이다.
2) 2차원 배열을 매개변수로 넘기기
void printArr(int arr[2][3]) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main() {
int arr[2][3] = { {1,2,3},{4,5,6} };
printArr(arr);
}
2차원 배열은 배열포인터 형태로 넘긴다.
void printArr(int (* arr)[3]){
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main() {
int arr[2][3] = { {1,2,3},{4,5,6} };
printArr(arr);
}
여기서도 printArr은 Call-by-reference 이다.
37강. 함수 종합문제
1. 정수 하나를 매개변수로 받아 그 정수가 짝수이면 0, 홀수이면 1을 반환하는 함수를 작성해보세요.
int parity(int n) {
if (n % 2 == 0) {
return 0;
}
return 1;
}
int main() {
printf("%d\n", parity(5));
printf("%d\n", parity(-3));
printf("%d\n", parity(6));
}
결과 :
1
1
0
int parity(int n) {
return (n % 2+2)%2;
}
int main() {
printf("%d\n", parity(5));
printf("%d\n", parity(-3));
printf("%d\n", parity(6));
}
2. 다음 프로그램의 실행 결과는 ?
int useCnt[5] = { 0 };
void useItem(int);
int main() {
useItem(4);
useItem(2);
useItem(1);
useItem(4);
useItem(0);
for (int i = 0; i < 5; i++) {
printf("슬롯 %d의 아이템을 %d번 썼습니다.\n", i, useCnt[i]);
}
}
void useItem(int itemNum) {
useCnt[itemNum]++;
}
결과
3. 다음 프로그램의 실행 결과는 ?
void rec(int n) {
if (n == 0) return;
printf("%d", n);
rec(n - 1);
printf("%d", n);
}
int main() {
rec(5);
}
결과
4. 문자열을 매개변수로 받아 그 문자열에서 공백을 제거하여 출력하는 함수를 작성해보세요.
매개변수는 char str[] 또는char *str
void print_noSpace(char str[]) {
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] != ' ')
printf("%c", str[i]);
}
}
int main() {
print_noSpace("Hello, World!\n");
print_noSpace("My name is Doodle\n");
}
반응형
'개발자' 카테고리의 다른 글
두들낙서 C/C++ 42~43강 구조체 안에 함수를 집어넣기, 구조체 종합문제 (0) | 2022.08.12 |
---|---|
두들낙서 C/C++ 38 ~ 41강 typedef, 구조체 만들기, 구조체와 메모리, 구조체 가리키기(구조체 포인터) (0) | 2022.08.11 |
두들낙서 C/C++ 31강~35강 함수, 함수의 반환, call by reference, 프로토 타입, 재귀 함수 (0) | 2022.06.20 |
두들낙서 C/C++ 24강~30강 포인터, 배열 포인터 , 포인터 배열 종합문제 (0) | 2022.06.17 |
두들낙서 C/C ++ 22강, 23강 2차원 배열, 문자열 함수 strlen, strcpy, strcat, strcmp (0) | 2022.06.17 |
댓글