Re: 포인터에 동적메모리 사용하여 3차원배열 만들기
, 도장_ 관리자님이 작성UNIT 38.6 연습문제에서
정답과 그림으로 그려진 설명을 보면 이해할 수 있습니다.
UNIT 38.6의 빈칸을 완성한 전체 코드는 다음과 같습니다.
연습문제는 int 값을 담기 위한 3차원 배열을 선언해서 사용합니다.
UNIT 39.1을 학습하면 좀 더 자세히 이해할 수 있는데,
문자와 문자열은 다릅니다.
int는 숫자이고, 숫자열이라는 것은 없습니다. 숫자를 담기 위해서는 반드시 배열이 필요하죠.
char는 문자이지만, 문자열이 있으니 배열이 아니어도 문자열을 담을 수 있습니다. 단, 첨자 연산자 []를 사용해서 문자열은 배열처럼 접근할 수 있습니다.
따라서 2차원 배열을 char로 선언했을 때
세로 인덱스로는 층에 접근하지만,
가로 인덱스로 개별 문자 하나에 접근할 수도 있지만,
'세로 인덱스' 지정으로 문자열 전체에 접근할 수도 있습니다.
'세로 인덱스'를 지정해서 %s로 문자열 전체를 한 번에 입력받을 수도 있고,
'세로 인덱스'와 '가로 인덱스'를 지정해서 %c로 한 번에 문자 하나씩 입력받을 수도 있습니다.
문자열의 경우엔 보통 '세로 인덱스'를 지정하고, %s로 문자열 전체를 입력받는게 편하니까 문자열로 입력받습니다.
문자열로 입력받을 때
Hello
가로 인덱스를 문자로 하나씩 입력받을 때
H
e
l
l
o
이렇게 입력받으면 불편하니까 보통은 첫 번째처럼 문자열로 입력을 받습니다.
char*로 한 번에 입력을 받을 것인가,
char[0]에 'H', char[1]에 'e'.... 하나씩 입력받을 것인가의 문제이고,
입력 방식에 따라 코드도 달리 작성해야 합니다.
char***로 된 삼중 포인터로 3차원 배열에 접근한다면
깊이, 세로 인덱스까지 지정해서 마지막 문자열(가로인덱스)은 문자열로 입력을 받거나
깊이, 세로, 가로 인덱스까지 지정해서 문자로 하나씩 입력을 받거나 선택해야 합니다.
문의한 코드는 입력을
깊이, 세로, 가로 인덱스까지 지정했으니 '문자 하나'만 입력받겠다는 방식의 코드이고, scanf는 %c를 써야 합니다.
그러나 문의한 코드는 깊이, 세로, 가로 인덱스를 모두 지정해서 '문자 하나' 공간을 가리키면서 scanf에서는 %s를 지정해서 '나는 문자열을 입력받겠다'고 했으니 메모리 오류가 발생합니다.
Hello를 입력받는다면 '문자 하나' 공간을 지정했고, 여기에 "Hello" 문자열을 넣어라. 라고 지시한 것이니까요.