Minwoo Dev.

<윤성우의 열혈 C프로그래밍> :: 18. 다차원 배열과 포인터의 관계 본문

C++

<윤성우의 열혈 C프로그래밍> :: 18. 다차원 배열과 포인터의 관계

itisminu 2023. 9. 6. 16:21
728x90
반응형
SMALL

문제 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;
}

 

728x90
반응형
LIST