강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

dhkdxo12님의 프로필 이미지
dhkdxo12

작성한 질문수

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

다차원 배열과 문자열 배열

다차원 문자 배열 관련 포인터 변수

해결된 질문

작성

·

18

0

다차원 배열과 문자열 배열 21:45

 

다차원 문자열 배열에서 포인터 변수 관련으로 질문이 있습니다.

 

*arr[2][2]={{"Hello", "World"}, {"app", "dev"}}

이렇게 2차원 문자 배열이 있을 때

printf("%c\n", arr);의 답은 arr의 초기값으로

H인지 아니면 Hello인지 궁금합니다.

그리고 arr+1 또는 arr ++ 하면 다음 주소로 이동하는 값을 나타내는 것이라고 하는데 그러면 답이 e인지 아니면 World인지 궁금합니다.

 

답변 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분 쯤 링크를 읽어보시는 것을 추천드립니다. 이 링크에서는 포인터와 배열의 기본 개념을 확장하는 방식으로 이해를 돕고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dhkdxo12님의 프로필 이미지
dhkdxo12

작성한 질문수

질문하기