Minwoo Dev.
<윤성우의 열혈 C프로그래밍> :: 18. 다차원 배열과 포인터의 관계 본문
문제 18-1
문제 1
아래에서 보이는 main 함수에서 물음표 ???을 대신할 수 있는 포인터 변수를 선언해보자.
int main(void)
{
int * arr1[5];
int *arr2[3][5];
??? = arr1;
??? = arr2;
. . . .
}
참고로 이 문제는 난이도가 조금 높은 편이다. 이번 Chapter의 내용을 잘 이해한 상태에서 적절히 응용을 해서 해결해야 하는 문제이기 때문이다. 그렇다고 해서 그냥 답을 봐버리면 의미 없는 문제가 될 것이다. 고민해서 해결하자! 그러면 마음속 깊이 포인터를 정복했다는 뿌듯함이 밀려올 것이다.
정답
arr1은 int형 포인터 변수로 이루어진 배열, 즉 포인터 배열이다.
1차원 배열이고, int형 싱글 포인터 변수를 가리키므로 arr의 포인터 형은 int형 더블 포인터이다.
결론적으로 첫번째 ???에 들어갈 답은
int **ptr1 = arr1;
두 번째 ???는 int형 포인터 변수로 이루어진 "포인터 배열" 이다. 가로 길이가 5이므로 ???를 채우면
int* (*ptr2)[5] = arr2;
문제 2
아래의 코드를 참조하여 ???을 대신할 수 있는 매개변수 선언을 추가해보자.
void SimpleFuncOne(???,???) {. . . . .}
void SimpleFuncTwo(???,???) {. . . . .}
int main(void)
{
int arr1[3];
int arr2[4];
int arr3[3][4];
int arr4[2][4];
SimpleFuncOne(arr1,arr2);
SimpleFuncTwo(arr3,arr4);
}
정답
void SimpleFuncOne(int *ar1, int *ar2) {. . . . .}
void SimpleFuncTwo(int *(ar3)[4], int *(ar4)[4]) {. . . . .}
문제 3
이 문제도 위의 문제와 유사하다. 즉, ???을 대신할 수 있는 매개변수 선언을 추가하는 것이다. 그러나 이번에는 약간의 응용력을 요구한다.
void ComplexFuncOne(???,???) {. . . . .}
void ComplexFuncTwo(???,???) {. . . . .}
int main(void)
{
int* arr1[3];
int* arr2[3][5];
int** arr3[5];
int*** arr4[3][5];
ComplexFuncOne(arr1,arr2);
ComplexFuncTwo(arr3,arr4);
. . . .
}
정답
void ComplexFuncOne(int **ar1, int *(*ar2)[5]) {. . . . .}
void ComplexFuncTwo(int ***ar3, int ***(*ar4)[5]) {. . . . .}
문제 4
다음 예제의 출력 결과는 무엇인가 ? 이는 예제를 실행하지 않고 답을 해야한다.
#include<stdio.h>
int main(void)
{
int arr[3][2] = {{1,2},{3,4},{5,6}};
printf("%d %d\n",arr[1][0],arr[0][1]);
printf("%d %d\n",*(arr[2]+1),*(arr[1]+1));
printf("%d %d\n",(*(arr+2))[0],(*(arr+0))[1]);
printf("%d %d\n",**arr,*(*(arr+0)+0));
return 0;
}
정답
3 2
6 4
5 2
1 1
실행 결과
문제 5
아래의 코드를 보자(3차원 배열이라고 겁을 먹을 필요는 없다. 이 문제는 3차원 배열의 특성을 몰라도 해결할 수 있는 문제다.) . 이 예제에서는 인덱스[1][0][1]의 배열요소를 출력하고 있다. 이 때 사용된 arr[1][0][1]을 대신할 수 있는 문장을 5개 이상 제시해보자.
#include<stdio.h>
int main(void)
{
int arr[2][2][2] = {1,2,3,4,5,6,7,8};
printf("%d\n",arr[1][0][1]);
return 0;
}
정답
(*(arr+1))[0][1]
(*(*(arr+1))+0)[1]
(*(*(*(arr+1))+0)+1)
(*(arr[1])+0)[1]
(*(*(arr+1)[0])+1)
실행 결과
#include<stdio.h>
int main(void)
{
int arr[2][2][2] = {1,2,3,4,5,6,7,8};
printf("%d\n",arr[1][0][1]);
printf("%d\n",(*(arr+1))[0][1]);
printf("%d\n",(*(*(arr+1))+0)[1]);
printf("%d\n",(*(*(*(arr+1))+0)+1));
printf("%d\n",(*(arr[1])+0)[1]);
printf("%d\n",(*(*(arr+1)[0])+1));
return 0;
}
'C++' 카테고리의 다른 글
<윤성우의 열혈 C프로그래밍> :: 21. 문자와 문자열 관련 함수 문제풀이 (0) | 2023.09.09 |
---|---|
<윤성우의 열혈 C프로그래밍> :: 20. 도전! 프로그래밍 3 문제풀이 (0) | 2023.09.08 |
<윤성우의 열혈 C프로그래밍> :: 17.포인터의 포인터 문제풀이 (0) | 2023.09.05 |
<윤성우의 열혈 C프로그래밍> :: 16. 다차원 배열 문제풀이 (0) | 2023.09.05 |
<윤성우의 열혈 C프로그래밍> :: 15. 도전! 프로그래밍 2 문제풀이 (0) | 2023.09.05 |