본문 바로가기
개발자

두들낙서 C/C++ 36강, 37강 배열을 매개변수로 넘기기, 종합문제

by ⁖⁝‥ 2022. 8. 11.

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");
}

 

반응형

댓글