인프런 커뮤니티 질문&답변
다차원 문자 배열 관련 포인터 변수
해결된 질문
작성
·
18
답변 2
0
메모리 주소가 들어있는 변수를 %c로 출력하려고 하면 오류가 발생합니다.
우리가 배운 범위에서 메모리 주소는 받아서 출력하는 것은 %s밖에 없습니다.
지금 printf로 출력하시려는 변수 arr은 메모리 주소이고, 그래서 %c로 하면 오류가 발생합니다.
arr의 구조는 이렇습니다.
const char *arr[2][2] = {{"Hello", "World"}, {"app", "dev"}};
// 이건 문자 배열이 아니라 포인터 배열입니다. 메모리 구조는 이렇습니다:
arr[0][0] → 포인터 → "Hello"
arr[0][1] → 포인터 → "World"
arr[1][0] → 포인터 → "app"
arr[1][1] → 포인터 → "dev"
`arr` 자체는 `arr[0]`의 주소, 즉 "포인터의 포인터"입니다.
arr+1은 뭘 가리키나?
arr의 타입은 const char ()[2] — 포인터 2개짜리 행의 주소입니다.
그러므로 arr+1은 다음 행 arr[1]의 주소로 이동합니다.
arr → { arr[0][0], arr[0][1] } // {"Hello", "World"}
arr+1 → { arr[1][0], arr[1][1] } // {"app", "dev"}
정리하자면,
printf("%s\n", arr[0][0]); // Hello ✅
printf("%c\n", arr[0][0][0]); // H ✅
printf("%s\n", arr[0][0]+1); // ello ✅ (포인터+1 = 다음 문자)
printf("%s\n", arr[1][0]); // app ✅이렇게는 출력할 수가 있습니다.
전체 코드를 보여드리자면,
#include <stdio.h>
int main() {
const char *arr[2][2] = {{"Hello", "World"}, {"app", "dev"}};
// 기본 출력
printf("1. %s\n", arr[0][0]);
printf("2. %s\n", arr[0][1]);
printf("3. %s\n", arr[1][0]);
printf("4. %s\n", arr[1][1]);
// 포인터 활용 출력
printf("5. %s\n", arr[0][0]);
printf("6. %c\n", arr[0][0][0]);
printf("7. %s\n", arr[0][0]+1);
printf("8. %s\n", arr[1][0]);
return 0;
}
출력값은
1. Hello
2. World
3. app
4. dev
5. Hello
6. H
7. ello
8. app
입니다.
0
안녕하세요, 인프런 AI 인턴입니다. dhkdxo12님.
다차원 배열을 사용하면서 발생할 수 있는 혼란에 대해 설명드리겠습니다.
1. 다차원 배열에서 포인터 변수의 역할
char *arr[2][2] 구조는 다양한 문자열을 저장하는 배열입니다. 각 요소는 특정 문자열의 시작 주소를 가리키며, 이는 상대적인 메모리 주소로 구성됩니다.
2. printf("%c\n", arr);의 결과
arr 자체는 포인터 배열의 첫 번째 요소를 가리키기 때문에, 단순히 arr로는 배열의 첫 번째 문자열 즉, “Hello”의 시작 주소를 가리킵니다. 하지만 %c 포맷은 단일 문자를 출력하기 때문에 printf("%c\n", *arr[0][0]);은 ‘H’를 출력합니다.
3. arr + 1 또는 arr++의 동작
arr는 시작 주소일뿐, 이런 상황에서 arr + 1은 다음 배열 위치로 한 단계 전진하여 “World“의 시작 주소를 가리킵니다. 하지만, 배열 전체에서 포인터 산술이 적용되며, 일반적으로 이러한 산술의 결과는 의미 있는 데이터로 바로 쓰이지 않으니 신중히 다가서야 합니다. 여기서 “e”가 아니라 “World“의 첫 문자를 가리키게 됩니다.
유사 사례 및 설명
해당 주제를 더 깊이 이해하고 싶으시다면, 다차원 배열과 문자열 배열 22분 쯤 링크를 읽어보시는 것을 추천드립니다. 이 링크에서는 포인터와 배열의 기본 개념을 확장하는 방식으로 이해를 돕고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




